Bagaimana cara meneruskan X melalui SSH untuk menjalankan aplikasi grafis dari jarak jauh?

344

Saya memiliki mesin yang menjalankan Ubuntu yang saya SSH dari dari mesin Fedora 14 saya. Saya ingin meneruskan X dari mesin Ubuntu kembali ke Fedora sehingga saya dapat menjalankan program grafis dari jarak jauh. Kedua mesin berada di LAN.

Saya tahu bahwa -Xopsi ini memungkinkan penerusan X11 di SSH, tetapi saya merasa seperti saya kehilangan beberapa langkah.

Apa langkah-langkah yang diperlukan untuk meneruskan X dari mesin Ubuntu ke Fedora melalui SSH?

Tuan Shickadance
sumber
6
Saya tahu ini agak umum, tetapi saya mengalami masalah. Jawaban pasti untuk pertanyaan ini akan sangat membantu bagi banyak orang. Banyak contoh di sekitar tampak menghilangkan detail penting.
Tn. Shickadance

Jawaban:

412

Penerusan X11 perlu diaktifkan di sisi klien dan sisi server.

Di sisi klien , opsi -X(kapital X) untuk sshmengaktifkan penerusan X11, dan Anda dapat menjadikan ini default (untuk semua koneksi atau untuk koneksi khusus) dengan ForwardX11 yesin ~/.ssh/config.

Di sisi server , X11Forwarding yesharus ditentukan dalam /etc/ssh/sshd_config. Perhatikan bahwa defaultnya adalah penerusan (beberapa distribusi menyalakannya dalam pengaturan standarnya /etc/ssh/sshd_config), dan bahwa pengguna tidak dapat mengesampingkan pengaturan ini.

The xauthProgram harus diinstal pada sisi server. Jika ada program X11 di sana, sangat mungkin xauthada di sana. Dalam kasus yang tidak mungkin xauthdiinstal di lokasi yang tidak standar, dapat dipanggil melalui ~/.ssh/rc(di server!).

Perhatikan bahwa Anda tidak perlu mengatur variabel lingkungan apa pun di server. DISPLAYdan XAUTHORITYsecara otomatis akan diatur ke nilai yang tepat. Jika Anda menjalankan ssh dan DISPLAYtidak diatur, itu berarti ssh tidak meneruskan koneksi X11.

Untuk mengkonfirmasi bahwa ssh meneruskan X11, periksa baris yang berisi Requesting X11 forwardingdalam ssh -v -Xoutput. Perhatikan bahwa server tidak akan membalas dengan cara apa pun, tindakan pencegahan keamanan menyembunyikan detail dari penyerang potensial.

Gilles
sumber
31
@ pengguna: Tidak, Anda tidak perlu xhost +. xhostberasal dari era yang lebih lembut ketika memiliki mesin yang terhubung ke jaringan berarti Anda dapat dipercaya. xhost +berarti siapa pun yang dapat menipu IP Anda dapat mengendalikan sesi X server Anda. ssh -Xakan mengatur semua otorisasi yang diperlukan. Jika penerusan X11 dinonaktifkan di konfigurasi server, bicarakan dengan administrator Anda; jika itu tidak berhasil, lihat Meneruskan X11 melalui SSH jika konfigurasi server tidak mengizinkannya .
Gilles
6
Terima kasih telah menyebutkan xauth! Kurangnya itu di server barebones menyebabkan saya kesulitan.
vasi
5
+1 untuk membuat perbedaan antara ~/.ssh/configdan /etc/ssh/sshd_configdi tempat yang sama. Saya tidak tahu apakah itu file yang berbeda atau hanya perubahan nomenklatur.
puk
1
@KhurshidAlam Tidak masalah apakah server juga menjalankan lingkungan GUI. Periksa izin pada .Xauthorityfile. Jika menggunakan Red Hat atau sistem lain dengan SELinux, periksa konteks SELinux, lihat unix.stackexchange.com/questions/36540/…
Gilles
8
setelah ssh -Xmenjalankan xterm &untuk mendapatkan terminal grafis sebagai ujian utama untuk melihat apakah itu berfungsi.
Alexander Taylor
88

Untuk mendapatkan penerusan X11 bekerja lebih dari ssh, Anda perlu 3 hal di tempat.

  1. Klien Anda harus diatur untuk meneruskan X11.
  2. Server Anda harus diatur untuk memungkinkan penerusan X11.
  3. Server Anda harus dapat mengatur otentikasi X11.

Jika Anda memiliki # 1 dan # 2 di tempat tetapi tidak ada # 3, maka Anda akan berakhir dengan variabel lingkungan DISPLAY yang kosong.

Sup-ke-kacang, inilah cara agar penerusan X11 berfungsi.

  1. Di server Anda, pastikan / etc / ssh / sshd_config berisi:

    X11Forwarding yes
    X11DisplayOffset 10
    

    Anda mungkin perlu SIGHUP sshd sehingga mengambil perubahan ini.

    cat /var/run/sshd.pid | xargs kill -1
    
  2. Di server Anda, pastikan Anda telah menginstal xauth.

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

    Jika Anda belum menginstal xauth, Anda akan mengalami masalah "kosong DISPLAY environment variable".

  3. Di klien Anda, sambungkan ke server Anda. Pastikan untuk memberitahu ssh untuk mengizinkan penerusan X11. aku lebih memilih

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

tapi kamu mungkin suka

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

atau Anda dapat mengatur ini di ~ / .ssh / config Anda.


Saya berlari ke variabel lingkungan DISPLAY kosong ini sebelumnya hari ini ketika ssh'ing ke server baru yang saya tidak kelola. Melacak bagian xauth yang hilang cukup menyenangkan. Inilah yang saya lakukan, dan apa yang dapat Anda lakukan juga.

Di workstation lokal saya, di mana saya seorang administrator, saya memverifikasi bahwa / etc / ssh / sshd_config telah diatur untuk meneruskan X11. Ketika saya ssh -X kembali ke localhost, saya mendapatkan DISPLAY saya diatur dengan benar.

Memaksa DISPLAY untuk tidak disetel tidak terlalu sulit. Saya hanya perlu melihat apa yang sshd dan ssh lakukan untuk mengaturnya dengan benar. Inilah hasil lengkap dari semua yang saya lakukan di sepanjang jalan.

    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

Alih-alih menggunakan sudo untuk memaksa menyalin file ssh_host_ {dsa, rsa} _key saya ke tempatnya, saya menggunakan ssh-keygen untuk membuat yang dummy untuk saya sendiri.

    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.

Bilas-dan-ulangi dengan -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

Edit ~ / dummy-sshd / sshd_config untuk menunjuk ke file kunci ssh_host baru yang benar.

    # 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

Jalankan sshd pada port baru dalam mode non-detach:

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

Aduh, lebih baik perbaiki jalur itu:

    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 terminal baru dan ssh in ke localhost di port 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

Lihatlah tiga baris terakhir di sana. Saya kebetulan memiliki DISPLAY yang ditetapkan, dan memiliki dua baris yang tampak bagus dari / usr / bin / xauth.

Dari sana adalah permainan anak-anak untuk memindahkan / usr / bin / xauth ke /usr/bin/xauth.old saya, lepaskan sambungan dari ssh dan hentikan sshd, kemudian jalankan sshd dan ssh kembali ke localhost.

Ketika / usr / bin / xauth hilang, saya tidak melihat DISPLAY tercermin di lingkungan saya.


Tidak ada yang brilian terjadi di sini. Sebagian besar saya beruntung dalam memilih pendekatan yang waras untuk mencoba mereproduksi ini di mesin lokal saya.

Belden
sumber
1
Wow, terima kasih banyak atas jawaban Anda. Saya melakukan semuanya dengan baik kecuali export DISPLAY=:10. Saya tidak pernah menebak jumlah tampilan itu.
erm3nda
Ini tampilan offset 10! : D
41754
34

Pastikan bahwa:

  • Anda telah xauthmenginstal di server (lihat: xauth info/ xauth list).
  • Di server /etc/ssh/sshd_configfile Anda memiliki baris berikut:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • Di sisi klien, ~/.ssh/configfile Anda memiliki baris berikut:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • Di sisi klien, Anda telah menginstal X server (mis. MacOS: XQuartz; Windows: Xming).


Kemudian untuk melakukan penerusan X11 menggunakan SSH, Anda perlu menambahkan-Xssh perintah Anda , misalnya

ssh -v -X user@host

kemudian verifikasi bahwa Anda DISPLAYadalah tidak kosong:

echo $DISPLAY

Jika ya, maka memiliki parameter verbose untuk ssh ( -v), periksa apakah ada peringatan, misalnya

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

Jika Anda punya X11 yang tidak dipercaya seperti yang ditunjukkan di atas, maka coba -Ypanji sebagai gantinya (jika Anda mempercayai tuan rumah):

ssh -v -Y user@host

Lihat: Apa yang dimaksud dengan "Peringatan: penyiapan penerusan X11 tidak terpercaya: data kunci xauth tidak dihasilkan" artinya ketika ssh'ing dengan -X?


Jika Anda telah memperingatkan: Tidak ada data xauth , Anda dapat mencoba membuat .Xauthorityfile baru , mis

xauth generate :0 . trusted
xauth list

Lihat: Membuat / membangun kembali file .Xauthority baru


Jika Anda mendapat peringatan berbeda dari di atas, ikuti petunjuk selanjutnya.


kenorb
sumber
1
Panduan Definitif: Konfigurasi di sisi klien menandai perbedaan
user2928048
2
dan X11UseLocalhost no di sisi server
user2928048
17

Cara mengatasinya adalah menambahkan baris ini ke /etc/ssh/sshd_config:

X11UseLocalhost no

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

Kartu as
sumber
Saya memiliki 2 server Ubuntu. Di satu aku perlu diatur ke ya, di sisi lain itu harus tidak. Saya yakin ada penjelasan, tetapi ada baiknya mencoba keduanya.
alfonx
1
Perbaikan ini berhasil bagi saya !!
rigon
3
Harap klarifikasi jika Anda bermaksud meletakkan pengaturan ini di server atau klien
Klik
5

Membiarkan Ubuntu bash di Windows 10 berjalan ssh -X untuk mendapatkan lingkungan GUI di server jauh

  • Pertama

Instal semua yang berikut ini. Di Jendela, instal Xming. Di Ubuntu bash, gunakan sudo apt installuntuk menginstal ssh xauth xorg.

sudo apt install ssh xauth xorg
  • Kedua

Pergi ke folder berisi ssh_configfile, milikku /etc/ssh.

  • Ketiga

Edit ssh_configsebagai administrator (USE sudo). Di dalam ssh_config, menghapus hash #dalam garis ForwardAgent, ForwardX11, ForwardX11Trusted, dan mengatur argumen yang sesuai untuk yes.

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • Keempat

Dalam ssh_configfile, hapus hash depan #sebelum Port 22dan Protocol 2, dan juga tambahkan baris baru di akhir file untuk menyatakan lokasi file xauth XauthLocaion /usr/bin/xauth,, ingatlah menulis path file xauth Anda sendiri.

# /etc/ssh/ssh_config

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

Sekarang karena kita sudah selesai mengedit ssh_configfile, simpan ketika kita meninggalkan editor. Sekarang buka folder ~atau $HOME, tambahkan export DISPLAY=localhost:0ke .bashrcfile Anda dan simpan.

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

Kami hampir selesai. Mulai ulang shell bash Anda, buka Xmingprogram Anda dan gunakan ssh -X yourusername@yourhost. Kemudian nikmati lingkungan GUI.

ssh -X yourusername@yourhost

Masalahnya juga ada di subsistem Ubuntu di Windows, dan tautannya ada di

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

DestinyOne
sumber
3

Tambahkan X11UseLocalhost noke /etc/ssh/sshd_configdan mulai ulang server SSH.

Jika Anda tidak mendapatkan DISPLAY, periksa apakah xauth diinstal dengan benar dan kemudian coba lagi.

RHE / CEntos tidak memiliki masalah ini, ini adalah masalah Ubuntu!

stephen cooke
sumber
1

Bagi saya masalahnya adalah opsi mount nodev untuk / sistem file tmp. X11 membutuhkan file khusus untuk dibuat di sana.

Jadi periksa apa saja opsi mount untuk sistem file / tmp jika Anda menggunakan partisi atau disk terpisah untuk itu.

yakovpol
sumber
1
Saya pikir Anda mungkin ingin melihat jawaban lain untuk pertanyaan asli dan luangkan waktu sejenak untuk memikirkan bagaimana jawaban Anda sendiri meningkat pada mereka.
Sami Laine
1

Untuk menambah jawaban luar biasa sebelumnya (pengaturan ~/.ssh/configdan pemeriksaan untuk melihat apakah DISPLAYvariabel lingkungan diatur pada klien, pengaturan /etc/ssh/sshd_configdan pemasangan xauthpada server), pastikan xtermjuga diinstal pada klien, mis.

sudo apt-get install xterm
Aliz Rao
sumber
1

xauth bisa dikunci.

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

Menggunakan

xauth -b

Pada mesin yang saya coba sshkunci rusak xauth. Keluar dari sshsesi setelah mengeluarkan xauth -blalu masuk kembali akhirnya memungkinkan saya untuk berhasil echo $DISPLAY. Cobalah ini sebelum membuat ulang.Xauthority

Barton Chittenden
sumber
0

X11Forwardingharus ditetapkan pada server SSH (dalam kasus Anda kotak Ubuntu) di dalamnya sshd_config, dan Anda harus mengizinkan X11 untuk diteruskan untuk klien SSH (kotak Fedora Anda) dengan meneruskan -Xopsi atau mengedit ssh_configfile untuk menambahkan ForwardX11default.

Caleb
sumber
1
Anda juga perlu xauthdiinstal pada mesin remote, jika hal-hal x otoritas tidak akan berfungsi.
Faheem Mitha
Bagaimana dengan pengaturan DISPLAY?
Tn. Shickadance
1
ssh akan secara otomatis ditetapkan $DISPLAYjika X11Forwardingdiaktifkan dan xauthhadir pada sistem klien.
Shadur
1
@ Safur Bukan untuk saya. Ini bekerja ketika saya export DISPLAY=:10.0tetapi tidak sebaliknya. Kalau tidak, ia mengeluh tidak dapat menemukan :0. Mungkin hal lain diperlukan agar ini terjadi secara otomatis?
cfr