Come inoltrare X su SSH per eseguire applicazioni grafiche in remoto?


345

Ho una macchina che esegue Ubuntu a cui SSH dalla mia macchina Fedora 14. Voglio inoltrare X dalla macchina Ubuntu a Fedora in modo da poter eseguire programmi grafici da remoto. Entrambe le macchine sono su una LAN.

So che l' -Xopzione abilita l'inoltro X11 in SSH, ma sento che mi mancano alcuni passaggi.

Quali sono i passaggi necessari per inoltrare X da una macchina Ubuntu a Fedora su SSH?


6
So che questo è piuttosto comune, ma sto riscontrando problemi. Una risposta definitiva a questa domanda sarebbe utile per molti. Molti esempi in giro sembrano tralasciare dettagli importanti.
Mr. Shickadance,

Risposte:


413

L'inoltro X11 deve essere abilitato sia sul lato client che sul lato server.

Sul lato client , l' -Xopzione (maiuscola X) per sshabilitare l'inoltro X11, e puoi renderla predefinita (per tutte le connessioni o per una specifica connessione) con ForwardX11 yesin ~/.ssh/config.

Sul lato server , X11Forwarding yesdeve essere specificato in /etc/ssh/sshd_config. Si noti che il valore predefinito non è inoltro (alcune distribuzioni lo attivano come predefinito /etc/ssh/sshd_config) e che l'utente non può ignorare questa impostazione.

Il xauthprogramma deve essere installato sul lato server. Se ci sono programmi X11 lì, è molto probabile che xauthci saranno. Nel caso improbabile è xauthstato installato in una posizione non standard, può essere chiamato attraverso ~/.ssh/rc(sul server!).

Si noti che non è necessario impostare alcuna variabile di ambiente sul server. DISPLAYe XAUTHORITYverrà automaticamente impostato sui valori corretti. Se si esegue ssh e DISPLAYnon è impostato, significa che ssh non sta inoltrando la connessione X11.

Per confermare che ssh è X11 forwarding, verificare la presenza di una linea che contiene Requesting X11 forwardingnel ssh -v -Xuscita. Si noti che il server non risponderà in entrambi i modi, una precauzione di sicurezza per nascondere i dettagli ai potenziali aggressori.


31
@utente: No, non hai mai bisogno xhost +. xhostè di un'era più delicata quando avere una macchina collegata alla rete significava che eri degno di fiducia. xhost +significa che chiunque può falsificare il tuo IP può assumere il controllo della sessione del tuo server X. ssh -Ximposterà tutte le autorizzazioni richieste. Se l'inoltro X11 è disabilitato nella configurazione del server, parlare con l'amministratore; se non funziona, vedi Inoltro X11 su SSH se la configurazione del server non lo consente .
Gilles,

6
Grazie per aver menzionato xauth! La mancanza di ciò su un server barebone mi stava causando problemi.
vasi

5
+1 per fare la distinzione tra ~/.ssh/confige /etc/ssh/sshd_confignello stesso posto. Non riuscivo a capire se fossero file diversi o solo un cambiamento nella nomenclatura.
puk

1
@KhurshidAlam Non importa se il server esegue anche un ambiente GUI. Controlla le autorizzazioni sul .Xauthorityfile. Se usi Red Hat o un altro sistema con SELinux, controlla il contesto SELinux, vedi unix.stackexchange.com/questions/36540/…
Gilles

8
dopo l' ssh -Xesecuzione xterm &per ottenere un terminale grafico come test finale per vedere se funziona.
Alexander Taylor,

88

Per far funzionare l'inoltro X11 su ssh, avrai bisogno di 3 cose sul posto.

  1. Il client deve essere configurato per l'inoltro di X11.
  2. Il server deve essere impostato per consentire l'inoltro X11.
  3. Il tuo server deve essere in grado di configurare l'autenticazione X11.

Se hai sia il n. 1 che il n. 2 in posizione ma manca il n. 3, finirai con una variabile di ambiente DISPLAY vuota.

Soup-to-nut, ecco come far funzionare l'inoltro X11.

  1. Sul tuo server, assicurati che / etc / ssh / sshd_config contenga:

    X11Forwarding yes
    X11DisplayOffset 10
    

    Potrebbe essere necessario SIGHUP sshd in modo che rilevi queste modifiche.

    cat /var/run/sshd.pid | xargs kill -1
    
  2. Sul tuo server, assicurati di aver installato xauth.

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

    Se xauth non è installato, si verificherà il problema "variabile ambiente DISPLAY vuota".

  3. Sul tuo client, connettiti al tuo server. Assicurati di dire a ssh di consentire l'inoltro X11. preferisco

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

ma ti potrebbe piacere

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

oppure puoi impostarlo nel tuo ~ / .ssh / config.


Oggi mi imbattevo in questa variabile di ambiente DISPLAY vuota quando mi trovavo in un nuovo server che non gestisco. Rintracciare la parte xauth mancante è stato un po 'divertente. Ecco cosa ho fatto e cosa puoi fare anche tu.

Sulla mia workstation locale, di cui sono amministratore, ho verificato che / etc / ssh / sshd_config fosse impostato per inoltrare X11. Quando faccio di nuovo ssh -X su localhost, ottengo il mio DISPLAY impostato correttamente.

Costringere DISPLAY a disinserirsi non è stato troppo difficile. Avevo solo bisogno di vedere cosa stavano facendo sshd e ssh per impostarlo correttamente. Ecco l'output completo di tutto ciò che ho fatto lungo la strada.

    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

Invece di usare sudo per forzare la copia dei miei file ssh_host_ {dsa, rsa} _key in posizione, ho usato ssh-keygen per creare quelli fittizi per me stesso.

    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.

Risciacquare e ripetere con -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

Modifica ~ / dummy-sshd / sshd_config per puntare ai nuovi file di chiavi ssh_host corretti.

    # 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

Avvia sshd su una nuova porta in modalità non distaccata:

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

Whoops, meglio correggere quel percorso:

    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.

Pop un nuovo terminale e ssh in localhost sulla 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

Guarda le ultime tre righe lì. Per fortuna ho impostato DISPLAY e ho avuto quelle due belle linee da / usr / bin / xauth.

Da lì è stato un gioco da ragazzi spostare da parte mia / usr / bin / xauth a /usr/bin/xauth.old, disconnettersi da ssh e arrestare sshd, quindi riavviare sshd e ssh su localhost.

Quando / usr / bin / xauth non c'era più, non ho visto DISPLAY riflesso nel mio ambiente.


Non sta succedendo niente di geniale qui. Principalmente ho avuto la fortuna di scegliere un approccio sano per provare a riprodurlo sulla mia macchina locale.


1
Wow, grazie mille per la tua risposta. Stavo facendo tutto bene tranne il export DISPLAY=:10. Non ho mai indovinato quel numero di display.
erm3nda,

È un offset di visualizzazione di 10! : D
41754,

34

Assicurati che:

  • Hai xauthinstallato sul server (vedi: xauth info/ xauth list).
  • Sul server il tuo /etc/ssh/sshd_configfile ha queste righe:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • Sul lato client il tuo ~/.ssh/configfile ha queste righe:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • Sul lato client, hai installato X server (ad esempio macOS: XQuartz; Windows: Xming).


Quindi per eseguire l'inoltro X11 utilizzando SSH, è necessario aggiungere -Xalssh comando, ad es

ssh -v -X user@host

quindi verificare che il vostro DISPLAYè non vuota:

echo $DISPLAY

In tal caso, avendo quindi un parametro dettagliato per ssh ( -v), controllare eventuali avvisi, ad es

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

Se hai X11 non attendibile come mostrato sopra, prova-Y invece a contrassegnare (se ti fidi dell'host):

ssh -v -Y user@host

Vedi: Cosa significa "Avvertenza: installazione dell'inoltro X11 non attendibile non riuscita: dati chiave xauth non generati" significa quando si invia con -X?


In caso di avviso: nessun dato xauth , è possibile provare a generare un nuovo .Xauthorityfile, ad es

xauth generate :0 . trusted
xauth list

Vedi: Crea / ricostruisci un nuovo file .Xauthority


Se hai un avviso diverso da quello sopra, segui gli ulteriori indizi.



1
La guida definitiva: la configurazione sul lato client ha segnato la differenza
user2928048,

2
e X11UseLocalhost no sul lato server
user2928048

17

La soluzione è aggiungere questa riga al tuo /etc/ssh/sshd_config:

X11UseLocalhost no

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


Ho 2 server Ubuntu. Da un lato avevo bisogno che fosse impostato su sì, dall'altro doveva essere no. Sono sicuro che ci sia una spiegazione, ma vale la pena provare entrambi.
alfonx,

1
Questa correzione ha funzionato per me !!
Rigon,

3
Si prega di chiarire se si intende mettere questa impostazione sul server o sul client
Klik

5

Lasciare Ubuntu bash su Windows 10 eseguito ssh -X per ottenere un ambiente GUI su un server remoto

  • Primo

Installa tutto quanto segue. Su Windows, installa Xming. Su Ubuntu bash, usa sudo apt installper installare ssh xauth xorg.

sudo apt install ssh xauth xorg
  • Secondo

Vai alla cartella contiene ssh_configfile, il mio è /etc/ssh.

  • Terzo

Modifica ssh_configcome amministratore (USA sudo). All'interno ssh_config, rimuovere l'hash #nelle linee ForwardAgent, ForwardX11, ForwardX11Trusted, e impostare i corrispondenti argomenti yes.

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • Via

Nel ssh_configfile, rimuovi l'hash anteriore #prima Port 22e Protocol 2, e aggiungi anche una nuova riga alla fine del file per indicare la posizione del file xauth XauthLocaion /usr/bin/xauth, ricorda di scrivere il tuo percorso del file xauth.

# /etc/ssh/ssh_config

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

Ora che abbiamo finito di modificare il ssh_configfile, salvalo quando lasciamo l'editor. Ora vai alla cartella ~o $HOME, aggiungi export DISPLAY=localhost:0al tuo .bashrcfile e salvalo.

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

Abbiamo quasi finito. Riavvia la shell bash, apri il Xmingprogramma e usalo ssh -X yourusername@yourhost. Quindi goditi l'ambiente della GUI.

ssh -X yourusername@yourhost

Il problema si trova anche nel sottosistema Ubuntu su Windows e il collegamento è all'indirizzo

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


3

Aggiungere X11UseLocalhost noal /etc/ssh/sshd_confige riavviare il server SSH.

Se non viene visualizzato DISPLAY, verificare che xauth sia installato correttamente, quindi riprovare.

RHE / CEntos non ha questo problema, questa è una cosa di Ubuntu!


1

Per me il problema era nell'opzione mount nodev per il filesystem / tmp. X11 ha bisogno di creare un file speciale lì dentro.

Quindi controlla quali sono le opzioni di mount per il filesystem / tmp se usi una partizione o un disco separati per quello.


1
Penso che potresti voler vedere altre risposte alla domanda originale e prendere un momento per pensare a come la tua risposta migliora su di loro.
Sami Laine,

1

Per aggiungere alle risposte eccellenti precedenti (impostazione ~/.ssh/confige controllo per vedere se la DISPLAYvariabile di ambiente è impostata sul client, impostazione /etc/ssh/sshd_confige installazione xauthsul server), assicurarsi anche che xtermsia installato sul client, ad es.

sudo apt-get install xterm

1

xauth può essere bloccato.

   -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.

utilizzando

xauth -b

Sulla macchina che stavo cercando di sshrompere il blocco xauth. La disconnessione dalla sshsessione dopo l'emissione xauth -be il log-in alla fine mi hanno permesso di riuscirci echo $DISPLAY. Provalo sicuramente prima di ricrearlo.Xauthority


0

X11Forwardingdeve essere impostato sul server SSH (nel tuo caso la casella Ubuntu) nella sua sshd_config, e devi consentire a X11 di essere inoltrato per il client SSH (la tua casella Fedora) passando l' -Xopzione o modificando il ssh_configfile per aggiungere l' ForwardX11impostazione predefinita.


1
È inoltre necessario xauthinstallare sul computer remoto, altrimenti le cose dell'autorità x non funzioneranno.
Faheem Mitha,

Che dire dell'impostazione DISPLAY?
Mr. Shickadance,

1
ssh imposterà automaticamente $DISPLAYse X11Forwardingè abilitato ed xauthè presente sul sistema client.
Shadur,

1
@Shadur Non per me. Funziona quando io export DISPLAY=:10.0ma non altrimenti. Altrimenti, si lamenta di non poterlo trovare :0. Forse è necessario qualcos'altro perché ciò avvenga automaticamente?
cfr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.