Como encaminhar o X pelo SSH para executar aplicativos gráficos remotamente?

344

Eu tenho uma máquina executando o Ubuntu que eu SSH para a minha máquina Fedora 14. Quero encaminhar o X da máquina Ubuntu de volta ao Fedora para que eu possa executar programas gráficos remotamente. Ambas as máquinas estão em uma LAN.

Sei que a -Xopção habilita o encaminhamento do X11 no SSH, mas sinto que estou perdendo algumas das etapas.

Quais são as etapas necessárias para encaminhar o X de uma máquina Ubuntu para o Fedora via SSH?

Mr. Shickadance
fonte
6
Sei que isso é bastante comum, mas estou tendo problemas. Uma resposta definitiva para esta pergunta seria útil para muitos. Muitos exemplos parecem omitir detalhes importantes.
Sr. Shickadance

Respostas:

412

O encaminhamento do X11 precisa estar ativado no lado do cliente e no servidor.

No lado do cliente , a opção -X(X maiúsculo) para sshativar o encaminhamento do X11, e você pode torná-lo o padrão (para todas as conexões ou para uma conexão específica) com ForwardX11 yesin ~/.ssh/config.

No lado do servidor , X11Forwarding yesdeve ser especificado em /etc/ssh/sshd_config. Observe que o padrão é sem encaminhamento (algumas distribuições ativam-no por padrão /etc/ssh/sshd_config) e que o usuário não pode substituir essa configuração.

O xauthprograma deve ser instalado no lado do servidor. Se houver algum programa X11 lá, é muito provável que xauthesteja lá. No caso improvável de ter xauthsido instalado em um local fora do padrão, ele pode ser chamado através ~/.ssh/rc(no servidor!).

Observe que você não precisa definir nenhuma variável de ambiente no servidor. DISPLAYe XAUTHORITYserá automaticamente definido com seus valores adequados. Se você executar o ssh e DISPLAYnão estiver definido, significa que o ssh não está encaminhando a conexão X11.

Para confirmar se o ssh está encaminhando o X11, verifique se há uma linha Requesting X11 forwardingna ssh -v -Xsaída. Observe que o servidor não responderá de nenhuma maneira, uma precaução de segurança de ocultar detalhes de possíveis invasores.

Gilles
fonte
31
@ usuário: Não, você nunca precisa xhost +. xhosté de uma época mais delicada quando ter uma máquina conectada à rede significava que você era confiável. xhost +significa que qualquer pessoa que possa falsificar seu IP pode assumir o controle da sua sessão do servidor X. ssh -Xirá configurar todas as autorizações necessárias. Se o encaminhamento do X11 estiver desativado na configuração do servidor, converse com seu administrador; se isso não funcionar, consulte Encaminhamento X11 por SSH, se a configuração do servidor não permitir .
Gilles
6
Obrigado por mencionar o xauth! A falta disso em um servidor barebones estava me causando problemas.
11383
5
+1 para fazer a distinção entre ~/.ssh/confige /etc/ssh/sshd_configno mesmo local. Não sabia dizer se eram arquivos diferentes ou apenas uma alteração na nomenclatura.
puk
1
@KhurshidAlam Não importa se o servidor também está executando um ambiente de GUI. Verifique as permissões no .Xauthorityarquivo. Se estiver usando o Red Hat ou outro sistema com o SELinux, verifique o contexto do SELinux, consulte unix.stackexchange.com/questions/36540/…
Gilles
8
depois de ssh -Xexecutar xterm &para obter um terminal gráfico como o teste final para ver se está funcionando.
Alexander Taylor
88

Para que o encaminhamento do X11 funcione no ssh, você precisará de três itens.

  1. Seu cliente deve estar configurado para encaminhar o X11.
  2. Seu servidor deve estar configurado para permitir o encaminhamento do X11.
  3. Seu servidor deve poder configurar a autenticação X11.

Se você possui os itens 1 e 2, mas está faltando o número 3, terá uma variável de ambiente DISPLAY vazia.

Sopa de nozes, veja como fazer o encaminhamento do X11 funcionar.

  1. No seu servidor, verifique se / etc / ssh / sshd_config contém:

    X11Forwarding yes
    X11DisplayOffset 10
    

    Pode ser necessário o SIGHUP sshd, para que ele capte essas alterações.

    cat /var/run/sshd.pid | xargs kill -1
    
  2. No seu servidor, verifique se o xauth está instalado.

    belden@skretting:~$ which xauth
    /usr/bin/xauth
    

    Se você não tiver o xauth instalado, encontrará o problema "variável de ambiente DISPLAY vazia".

  3. No seu cliente, conecte-se ao seu servidor. Certifique-se de dizer ao ssh para permitir o encaminhamento do X11. eu prefiro

    belden@skretting:~$ ssh -X blyman@the-server
    

mas você pode gostar

    belden@skretting:~$ ssh -o ForwardX11=yes blyman@the-server

ou você pode configurá-lo em seu ~ / .ssh / config.


Hoje eu estava encontrando essa variável de ambiente DISPLAY vazia hoje, quando ssh'ing em um novo servidor que não administro. Rastrear a parte xauth que faltava foi um pouco divertido. Aqui está o que eu fiz e o que você pode fazer também.

Na minha estação de trabalho local, onde sou administrador, verifiquei que o / etc / ssh / sshd_config foi configurado para encaminhar o X11. Quando ssh -X volto ao localhost, o meu DISPLAY está configurado corretamente.

Forçar a desabilitação do DISPLAY não foi muito difícil. Eu só precisava assistir o que o sshd e o ssh estavam fazendo para configurá-lo corretamente. Aqui está o resultado completo de tudo o que fiz ao longo do caminho.

    blyman@skretting:~$ mkdir ~/dummy-sshd
    blyman@skretting:~$ cp -r /etc/ssh/* ~/dummy-sshd/
    cp: cannot open `/etc/ssh/ssh_host_dsa_key' for reading: Permission denied
    cp: cannot open `/etc/ssh/ssh_host_rsa_key' for reading: Permission denied

Em vez de usar o sudo para forçar a cópia dos meus arquivos ssh_host_ {dsa, rsa} _key no lugar, usei o ssh-keygen para criar arquivos fictícios para mim.

    blyman@skretting:~$ ssh-keygen -t rsa -f ~/dummy-sshd/ssh_host_rsa_key
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/blyman/dummy-sshd/ssh_host_rsa_key.
    Your public key has been saved in /home/blyman/dummy-sshd/ssh_host_rsa_key.pub.

Enxágüe e repita com -t dsa:

    blyman@skretting:~$ ssh-keygen -t dsa -f ~/dummy-sshd/ssh_host_dsa_key
    # I bet you can visually copy-paste the above output down here

Edite ~ / dummy-sshd / sshd_config para apontar para os novos arquivos de chave ssh_host corretos.

    # before
    blyman@skretting:~$ grep ssh_host /home/blyman/dummy-sshd/sshd_config 
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_dsa_key

    # after
    blyman@skretting:~$ grep ssh_host /home/blyman/dummy-sshd/sshd_config 
    HostKey /home/blyman/dummy-sshd/ssh_host_rsa_key
    HostKey /home/blyman/dummy-sshd/ssh_host_dsa_key

Inicie o sshd em uma nova porta no modo sem desanexação:

    blyman@skretting:~$ sshd -p 50505 -f ~/dummy-sshd/sshd_config -d
    sshd re-exec requires execution with an absolute path

Opa, corrija melhor esse caminho:

    blyman@skretting:~$ /usr/sbin/sshd -p 50505 -f ~/dummy-sshd/sshd_config -d
    debug1: sshd version OpenSSH_5.5p1 Debian-4ubuntu6
    debug1: read PEM private key done: type RSA
    debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
    debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
    debug1: private host key: #0 type 1 RSA
    debug1: read PEM private key done: type DSA
    debug1: Checking blacklist file /usr/share/ssh/blacklist.DSA-1024
    debug1: Checking blacklist file /etc/ssh/blacklist.DSA-1024
    debug1: private host key: #1 type 2 DSA
    debug1: setgroups() failed: Operation not permitted
    debug1: rexec_argv[0]='/usr/sbin/sshd'
    debug1: rexec_argv[1]='-p'
    debug1: rexec_argv[2]='50505'
    debug1: rexec_argv[3]='-f'
    debug1: rexec_argv[4]='/home/blyman/dummy-sshd/sshd_config'
    debug1: rexec_argv[5]='-d'
    Set /proc/self/oom_adj from 0 to -17
    debug1: Bind to port 50505 on 0.0.0.0.
    Server listening on 0.0.0.0 port 50505.
    debug1: Bind to port 50505 on ::.
    Server listening on :: port 50505.

Coloque um novo terminal e faça o ssh no host local na porta 50505:

    blyman@skretting:~$ ssh -p 50505 localhost
    The authenticity of host '[localhost]:50505 ([::1]:50505)' can't be established.
    RSA key fingerprint is 81:36:a5:ff:a3:5a:45:a6:90:d3:cc:54:6b:52:d0:61.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[localhost]:50505' (RSA) to the list of known hosts.
    Linux skretting 2.6.35-32-generic #67-Ubuntu SMP Mon Mar 5 19:39:49 UTC 2012 x86_64 GNU/Linux
    Ubuntu 10.10

    Welcome to Ubuntu!
     * Documentation:  https://help.ubuntu.com/

    1 package can be updated.
    0 updates are security updates.

    Last login: Thu Aug 16 15:41:58 2012 from 10.0.65.153
    Environment:
      LANG=en_US.UTF-8
      USER=blyman
      LOGNAME=blyman
      HOME=/home/blyman
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
      MAIL=/var/mail/blyman
      SHELL=/bin/bash
      SSH_CLIENT=::1 43599 50505
      SSH_CONNECTION=::1 43599 ::1 50505
      SSH_TTY=/dev/pts/16
      TERM=xterm
      DISPLAY=localhost:10.0
    Running /usr/bin/xauth remove unix:10.0
    /usr/bin/xauth add unix:10.0 MIT-MAGIC-COOKIE-1 79aa9275ced418dd445d9798b115d393

Veja as últimas três linhas lá. Por sorte, tive o DISPLAY configurado e essas duas linhas bonitas de / usr / bin / xauth.

A partir daí, era brincadeira de criança afastar meu / usr / bin / xauth para /usr/bin/xauth.old, desconectar do ssh e interromper o sshd, em seguida, inicie o sshd e o ssh novamente no localhost.

Quando o / usr / bin / xauth se foi, não vi o DISPLAY refletido no meu ambiente.


Não há nada brilhante acontecendo aqui. Principalmente, tive sorte em escolher uma abordagem sensata para tentar reproduzir isso na minha máquina local.

Belden
fonte
1
Uau, muito obrigado pela sua resposta. Eu estava fazendo tudo de bom, exceto o export DISPLAY=:10. Eu nunca adivinhei esse número de exibição.
Erm3nda 31/10/2015
É um deslocamento de exibição de 10! : D
41754 23/07
34

Certifique-se de que:

  • Você xauthinstalou no servidor (consulte: xauth info/ xauth list).
  • No servidor, seu /etc/ssh/sshd_configarquivo tem estas linhas:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • No lado do cliente, seu ~/.ssh/configarquivo tem as seguintes linhas:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • No lado do cliente, você tem o servidor X instalado (por exemplo, macOS: XQuartz; Windows: Xming).


Para fazer o encaminhamento do X11 usando SSH, você precisa adicionar -Xao seussh comando, por exemplo

ssh -v -X user@host

verifique se o seu nãoDISPLAY está vazio:

echo $DISPLAY

Se for, com um parâmetro detalhado para ssh ( -v), verifique se há avisos, por exemplo

debug1: No xauth program.
Warning: untrusted X11 forwarding setup failed: xauth key data not generated

Caso você tenha um X11 não confiável, como mostrado acima, tente -Ysinalizar (se você confiar no host):

ssh -v -Y user@host

Consulte: O que significa “Aviso: falha na configuração de encaminhamento do X11 não confiável: dados da chave xauth não gerados” significa quando o ssh'ing com -X?


Caso você avise: Sem dados xauth , você pode tentar gerar um novo .Xauthorityarquivo, por exemplo

xauth generate :0 . trusted
xauth list

Consulte: Criar / recriar um novo arquivo .Xauthority


Se você tiver avisos diferentes dos descritos acima, siga as outras dicas.


kenorb
fonte
1
O guia definitivo: Configuração no lado do cliente marcado a diferença
user2928048
2
e X11UseLocalhost não no lado do servidor
user2928048
17

A correção é adicionar esta linha ao seu /etc/ssh/sshd_config:

X11UseLocalhost no

https://joshua.hoblitt.com/rtfm/2013/04/how_to_fix_x11_forwarding_request_failed_on_channel_0/

Ás
fonte
Eu tenho 2 servidores Ubuntu. Por um lado, eu precisava definir sim, por outro, tinha que ser não. Estou certo de que há uma explicação, mas vale a pena tentar as duas coisas.
Alfonx
1
Essa correção funcionou para mim !!
Rigon
3
Por favor, esclareça se você quer dizer para colocar essa configuração no servidor ou cliente
Klik
5

Deixando o Ubuntu bash no Windows 10 executar ssh -X para obter um ambiente de GUI em um servidor remoto

  • Primeiro

Instale todos os seguintes. Na janela, instale Xming. No Ubuntu bash, use sudo apt installpara instalar ssh xauth xorg.

sudo apt install ssh xauth xorg
  • Segundo

Vá para a pasta contém o ssh_configarquivo, o meu é /etc/ssh.

  • Terceiro

Edite ssh_configcomo administrador (USE sudo). Dentro ssh_config, remover o hash #nas linhas ForwardAgent, ForwardX11, ForwardX11Trusted, e definir os argumentos correspondentes a yes.

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • Adiante

No ssh_configarquivo, remover o hash frente #antes Port 22e Protocol 2, além de acrescentar uma nova linha no final do arquivo para indicar o local do arquivo xauth, XauthLocaion /usr/bin/xauth, lembre-se escrever o seu próprio caminho de arquivo xauth.

# /etc/ssh/ssh_config

#   IdentifyFile ...
    Port 22
    Protocol 2
#   Cipher 3des
#   ...
#   ...
    ...
    ...
    GSSAPIDelegateCredentials no
    XauthLocaion /usr/bin/xauth
  • Quinto

Agora que terminamos de editar o ssh_configarquivo, salve-o quando sairmos do editor. Agora vá para a pasta ~ou $HOME, acrescente export DISPLAY=localhost:0ao seu .bashrcarquivo e salve-o.

# ~/.bashrc
...
...
export DISPLAY=localhost:0
  • Último

Estamos quase terminando. Reinicie seu shell bash, abra seu Xmingprograma e use ssh -X yourusername@yourhost. Então aproveite o ambiente da GUI.

ssh -X yourusername@yourhost

O problema também está no subsistema Ubuntu no Windows e o link está em

https://gist.github.com/DestinyOne/f236f71b9cdecd349507dfe90ebae776

DestinyOne
fonte
3

Adicionar X11UseLocalhost nopara /etc/ssh/sshd_confige reiniciar o servidor SSH.

Se você não exibir o DISPLAY, verifique se o xauth está instalado corretamente e tente novamente.

RHE / CEntos não tem esse problema, é uma coisa do Ubuntu!

Stephen Cooke
fonte
1

Para mim, o problema estava na opção de montagem nodev para o sistema de arquivos / tmp. O X11 precisa de um arquivo especial para ser criado lá.

Portanto, verifique quais são as opções de montagem para o sistema de arquivos / tmp se você usar uma partição ou disco separado para isso.

yakovpol
fonte
1
Eu acho que você pode querer ver outras respostas para a pergunta original e dedicar um momento para pensar em como sua própria resposta as melhora.
Sami Laine
1

Para adicionar as excelentes respostas anteriores (configuração ~/.ssh/confige verificação para ver se a DISPLAYvariável de ambiente está definida no cliente, configuração /etc/ssh/sshd_confige instalação xauthno servidor), verifique também se xtermestá instalada no cliente, por exemplo

sudo apt-get install xterm
Aliz Rao
fonte
1

xauth pode ficar bloqueado.

   -b      This  option  indicates  that  xauth  should  attempt to break any authority file locks before proceeding.  Use this
           option only to clean up stale locks.

Usando

xauth -b

Na máquina em que eu estava tentando ssharrombar a trava xauth. Terminar a sshsessão após a emissão e, em xauth -bseguida, efetuar o login finalmente me permitiu ter sucesso echo $DISPLAY. Definitivamente, tente isso antes de recriar.Xauthority

Barton Chittenden
fonte
0

X11Forwardingdeve ser definido no servidor SSH (no seu caso, a caixa Ubuntu) sshd_confige você deve permitir que o X11 seja encaminhado para o cliente SSH (sua caixa Fedora) passando a -Xopção ou editando o ssh_configarquivo para adicionar o ForwardX11padrão.

Caleb
fonte
1
Você também precisa estar xauthinstalado na máquina remota, caso contrário, o conteúdo da autoridade x não funcionará.
Faheem Mitha
E a configuração DISPLAY?
Sr. Shickadance
1
O ssh definirá automaticamente $DISPLAYse X11Forwardingestá ativado e xauthestá presente no sistema do cliente.
Shadur
1
@ Shahadur Não é para mim. Funciona quando eu, export DISPLAY=:10.0mas não de outra forma. Caso contrário, reclama que não pode encontrar :0. Talvez algo mais seja necessário para que isso aconteça automaticamente?
cfr