пересылка x11 с WSL2 на удаленную машину

#macos #ssh #x11 #wsl-2 #x11-forwarding

#macos #ssh #x11 #wsl-2 #x11-переадресация

Вопрос:

Я пытаюсь использовать приложения x11 на своем Mac с WSL2, но всякий раз, когда я подключаюсь к компьютеру по ssh, я получаю это предупреждение:

X11 forwarding request failed on channel 0

И echo $DISPLAY возвращает пустой.

На сервере я попытался отредактировать параметры X11 в файле sshd_config, чередовался между да и нет X11 UseLocalhost , отредактирован AddressFamily в inet, используется export DISPLAY=localhost:0.0 . Ничего не работает.

До сих пор мне удавалось использовать X11 на компьютере с Windows, где WSL установлен с помощью VcXsrv, но никогда удаленно с внешнего компьютера.

Ответ №1:

Итак, я понял, что я делал неправильно, потому что следовал этому руководству: на самом деле это означает, что при использовании ssh я сначала подключаюсь к Windows, а затем запрашиваю оболочку ubuntu (или что-то в этом роде).

Итак, я избавился от этой конфигурации и настроил подключение непосредственно к ssh-серверу Ubuntu, и вуаля, приложения x11 работают как шарм.

РЕДАКТИРОВАТЬ: чтобы это стало возможным, мне пришлось создать следующий файл .bat:

 @ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%wsl2-network.ps1
pwsh -NoProfile -ExecutionPolicy Bypass -Command "amp; pwsh %PowerShellScriptPath%"
::pwsh -NoProfile -ExecutionPolicy Bypass -Command "amp; wsl"
wsl sudo service ssh start
  

для этого используется следующий wsl2-network.ps1 сценарий:

 # WSL2 network port forwarding script v1
#   for enable script, 'Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser' in Powershell,
#   for delete exist rules and ports use 'delete' as parameter, for show ports use 'list' as parameter.
#   written by Daehyuk Ahn, Aug-1-2020

# Display all portproxy information
If ($Args[0] -eq "list") {
    netsh interface portproxy show v4tov4;
    exit;
} 

# If elevation needed, start new process
If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    # Relaunch as an elevated process:
    Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path),"$Args runas" -Verb RunAs
    exit
}

# You should modify '$Ports' for your applications 
$Ports = (22,80,443)

# Check WSL ip address
wsl hostname -I | Set-Variable -Name "WSL"
$found = $WSL -match 'd{1,3}.d{1,3}.d{1,3}.d{1,3}';
if (-not $found) {
    Write-Output "WSL2 cannot be found. Terminate script.";
    exit;
}

# Remove and Create NetFireWallRule
Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock';
if ($Args[0] -ne "delete") {
    New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $Ports -Action Allow -Protocol TCP;
    New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $Ports -Action Allow -Protocol TCP;
}

# Add each port into portproxy
$Addr = "0.0.0.0"
Foreach ($Port in $Ports) {
    Invoke-Expression "netsh interface portproxy delete v4tov4 listenaddress=$Addr listenport=$Port | Out-Null";
    if ($Args[0] -ne "delete") {
        Invoke-Expression "netsh interface portproxy add v4tov4 listenaddress=$Addr listenport=$Port connectaddress=$WSL connectport=$Port | Out-Null";
    }
}

# Display all portproxy information
netsh interface portproxy show v4tov4;

# Give user to chance to see above list when relaunched start
If ($Args[0] -eq "runas" -Or $Args[1] -eq "runas") {
    Write-Host -NoNewLine 'Press any key to close! ';
    $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');
}
  

Вы должны запустить файл .bat с правами администратора.

Комментарии:

1. Можете ли вы указать, как настроить подключение непосредственно к ssh-серверу Ubuntu?

2. @YueJIN обновил исходный ответ с объяснением того, как его настроить