Làm cách nào để chuyển tiếp X qua SSH để chạy các ứng dụng đồ họa từ xa?


342

Tôi có một máy chạy Ubuntu mà tôi SSH từ máy Fedora 14 của tôi. Tôi muốn chuyển tiếp X từ máy Ubuntu trở lại Fedora để tôi có thể chạy các chương trình đồ họa từ xa. Cả hai máy đều trên mạng LAN.

Tôi biết rằng -Xtùy chọn cho phép chuyển tiếp X11 trong SSH, nhưng tôi cảm thấy như mình đang thiếu một số bước.

Các bước cần thiết để chuyển tiếp X từ máy Ubuntu sang Fedora qua SSH là gì?


6
Tôi biết điều này khá phổ biến, nhưng tôi đang gặp vấn đề. Một câu trả lời dứt khoát cho câu hỏi này sẽ hữu ích cho nhiều người. Rất nhiều ví dụ xung quanh dường như bỏ qua các chi tiết quan trọng.
Ông Shickadance

Câu trả lời:


411

Chuyển tiếp X11 cần được bật ở cả phía máy khách và phía máy chủ.

Trên phía khách hàng , các -X(vốn X) tùy chọn để sshcho phép chuyển tiếp X11, và bạn có thể làm điều này mặc định (cho tất cả các kết nối hoặc cho một conection cụ thể) với ForwardX11 yestrong ~/.ssh/config.

Về phía máy chủ , X11Forwarding yesphải được chỉ định trong /etc/ssh/sshd_config. Lưu ý rằng mặc định là không chuyển tiếp (một số bản phân phối bật nó trong mặc định của chúng /etc/ssh/sshd_config) và người dùng không thể ghi đè cài đặt này.

Các xauthchương trình phải được cài đặt trên phía máy chủ. Nếu có bất kỳ chương trình X11 nào ở đó, rất có khả năng nó xauthsẽ ở đó. Trong trường hợp không chắc chắn xauthđã được cài đặt ở một vị trí không chuẩn, nó có thể được gọi thông qua ~/.ssh/rc(trên máy chủ!).

Lưu ý rằng bạn không cần đặt bất kỳ biến môi trường nào trên máy chủ. DISPLAYXAUTHORITYsẽ tự động được đặt thành giá trị phù hợp của chúng. Nếu bạn chạy ssh và DISPLAYkhông được đặt, điều đó có nghĩa là ssh không chuyển tiếp kết nối X11.

Để xác nhận rằng ssh đang chuyển tiếp X11, hãy kiểm tra một dòng có Requesting X11 forwardingtrong ssh -v -Xđầu ra. Lưu ý rằng máy chủ sẽ không trả lời theo bất kỳ cách nào, một biện pháp phòng ngừa bảo mật để ẩn chi tiết khỏi những kẻ tấn công tiềm năng.


31
@user: Không, bạn không bao giờ cần xhost +. xhostlà từ thời kỳ nhẹ nhàng hơn khi có một máy kết nối với mạng có nghĩa là bạn đáng tin cậy. xhost +có nghĩa là bất kỳ ai có thể giả mạo IP của bạn đều có thể kiểm soát phiên máy chủ X của bạn. ssh -Xsẽ thiết lập tất cả các ủy quyền cần thiết. Nếu chuyển tiếp X11 bị vô hiệu hóa trong cấu hình máy chủ, hãy nói chuyện với quản trị viên của bạn; nếu điều đó không hoạt động, hãy xem Chuyển tiếp X11 qua SSH nếu cấu hình máy chủ không cho phép .
Gilles

6
Cảm ơn đã đề cập đến xauth! Thiếu điều đó trên một máy chủ barebones đã gây rắc rối cho tôi.
vasi

5
+1 để phân biệt giữa ~/.ssh/config/etc/ssh/sshd_configở cùng một nơi. Tôi không thể biết liệu chúng là các tệp khác nhau hay chỉ là một thay đổi về danh pháp.
puk

1
@KhurshidAlam Không quan trọng việc máy chủ có chạy môi trường GUI hay không. Kiểm tra các quyền trên .Xauthoritytập tin. Nếu sử dụng Red Hat hoặc hệ thống khác với SELinux, hãy kiểm tra bối cảnh SELinux, xem unix.stackexchange.com/questions/36540/ Kẻ
Gilles

8
sau khi ssh -Xchạy xterm &để lấy một thiết bị đầu cuối đồ họa là thử nghiệm cuối cùng để xem nó có hoạt động không.
Alexander Taylor

87

Để chuyển tiếp X11 hoạt động trên ssh, bạn sẽ cần 3 thứ tại chỗ.

  1. Khách hàng của bạn phải được thiết lập để chuyển tiếp X11.
  2. Máy chủ của bạn phải được thiết lập để cho phép chuyển tiếp X11.
  3. Máy chủ của bạn phải có khả năng thiết lập xác thực X11.

Nếu bạn có cả số 1 và số 2 tại chỗ nhưng thiếu số 3, thì bạn sẽ kết thúc với một biến môi trường HIỂN THỊ trống.

Soup-to-nut, đây là cách để chuyển tiếp X11 hoạt động.

  1. Trên máy chủ của bạn, đảm bảo / etc / ssh / sshd_config chứa:

    X11Forwarding yes
    X11DisplayOffset 10
    

    Bạn có thể cần SIGHUP sshd để nó tiếp nhận những thay đổi này.

    cat /var/run/sshd.pid | xargs kill -1
    
  2. Trên máy chủ của bạn, đảm bảo bạn đã cài đặt xauth.

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

    Nếu bạn chưa cài đặt xauth, bạn sẽ gặp phải vấn đề "biến môi trường HIỂN THỊ trống".

  3. Trên máy khách của bạn, kết nối với máy chủ của bạn. Hãy chắc chắn nói với ssh để cho phép chuyển tiếp X11. tôi thích

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

nhưng bạn có thể thích

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

hoặc bạn có thể thiết lập điều này trong ~ / .ssh / config của bạn.


Tôi đã chạy vào biến môi trường HIỂN THỊ trống này vào đầu ngày hôm nay khi vào một máy chủ mới mà tôi không quản trị. Theo dõi phần xauth mất tích là một niềm vui nhỏ. Đây là những gì tôi đã làm, và những gì bạn cũng có thể làm.

Trên máy trạm cục bộ của tôi, nơi tôi là quản trị viên, tôi đã xác minh rằng / etc / ssh / sshd_config đã được thiết lập để chuyển tiếp X11. Khi tôi ssh -X quay lại localhost, tôi sẽ cài đặt HIỂN THỊ chính xác.

Buộc HIỂN THỊ không được đặt quá khó. Tôi chỉ cần xem sshd và ssh đang làm gì để thiết lập chính xác. Đây là đầu ra đầy đủ của tất cả mọi thứ tôi đã làm trên đường đi.

    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

Thay vì sử dụng sudo để buộc sao chép các tệp ssh_host_ {dsa, rsa} _key của tôi vào vị trí, tôi đã sử dụng ssh-keygen để tạo các tệp giả cho chính mình.

    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.

Rửa và lặp lại với -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

Chỉnh sửa ~ / dummy-sshd / sshd_config để trỏ đến các tệp chính ssh_host mới.

    # 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

Bật sshd trên một cổng mới ở chế độ không tách rời:

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

Rất tiếc, tốt hơn là sửa đường dẫn đó:

    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.

Bật một thiết bị đầu cuối mới và ssh vào localhost trên cổng 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

Nhìn vào ba dòng cuối cùng ở đó. Tôi tình cờ có bộ HIỂN THỊ và có hai dòng trông đẹp mắt từ / usr / bin / xauth.

Từ đó, trò chơi của trẻ em được chuyển sang / usr / bin / xauth sang /usr/bin/xauth.old, ngắt kết nối với ssh và dừng sshd, sau đó khởi chạy sshd và ssh trở lại localhost.

Khi / usr / bin / xauth biến mất, tôi không thấy HIỂN THỊ phản ánh trong môi trường của mình.


Không có gì tuyệt vời đang diễn ra ở đây. Chủ yếu là tôi đã may mắn khi chọn một cách tiếp cận lành mạnh để thử tái tạo điều này trên máy cục bộ của mình.


1
Wow, cảm ơn bạn rất nhiều cho anwer của bạn. Tôi đã làm mọi thứ tốt trừ export DISPLAY=:10. Tôi không bao giờ đoán số lượng hiển thị.
erm3nda

Đó là độ lệch màn hình là 10! : D
41754

33

Đảm bảo rằng:

  • Bạn đã xauthcài đặt trên máy chủ (xem: xauth info/ xauth list).
  • Trên máy chủ, /etc/ssh/sshd_configtập tin của bạn có các dòng sau:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • Về phía khách hàng, ~/.ssh/configtệp của bạn có các dòng sau:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • Về phía khách hàng, bạn đã cài đặt máy chủ X (ví dụ: macOS: XQuartz; Windows: Xming).


Sau đó, để thực hiện chuyển tiếp X11 bằng SSH, bạn cần thêm -Xvàossh lệnh của mình , vd

ssh -v -X user@host

sau đó xác minh rằng bạn DISPLAYkhông có sản phẩm nào theo:

echo $DISPLAY

Nếu có, sau đó có tham số dài dòng cho ssh ( -v), kiểm tra mọi cảnh báo, ví dụ:

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

Trong trường hợp bạn có X11 không đáng tin cậy như được hiển thị ở trên, thì hãy thử -Ygắn cờ thay thế (nếu bạn tin tưởng máy chủ):

ssh -v -Y user@host

Xem: Cảnh báo chuyển đổi X11 không tin cậy: thiết lập chuyển tiếp X11 không đáng tin cậy: dữ liệu khóa xauth không được tạo ra có nghĩa là gì khi ssh'ing với -X?


Trong trường hợp bạn đã cảnh báo: Không có dữ liệu xauth , bạn có thể thử tạo một .Xauthoritytệp mới , ví dụ:

xauth generate :0 . trusted
xauth list

Xem: Tạo / xây dựng lại tệp .Xmasterity mới


Nếu bạn có một cảnh báo khác với ở trên, hãy làm theo các manh mối tiếp theo.



1
Hướng dẫn dứt khoát: Cấu hình ở phía máy khách đánh dấu sự khác biệt
user2928048

2
và X11UseLocalhost không có ở phía máy chủ
user2928048

17

Cách khắc phục là thêm dòng này vào /etc/ssh/sshd_config:

X11UseLocalhost no

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


Tôi có 2 máy chủ Ubuntu. Mặt khác tôi cần nó được đặt thành có, mặt khác nó phải là không. Tôi chắc chắn có một lời giải thích, nhưng nó đáng để thử cả hai.
alfonx

1
Sửa chữa này làm việc cho tôi !!
rigon

3
Vui lòng làm rõ nếu bạn muốn đặt cài đặt này trên máy chủ hoặc máy khách
Klik

5

Để Ubuntu bash trên Windows 10 chạy ssh -X để có được môi trường GUI trên máy chủ từ xa

  • Đầu tiên

Cài đặt tất cả các mục sau đây. Trên cửa sổ, cài đặt Xming. Trên Ubuntu bash, sử dụng sudo apt installđể cài đặt ssh xauth xorg.

sudo apt install ssh xauth xorg
  • Thứ hai

Tới thư mục chứa ssh_configtập tin, của tôi là /etc/ssh.

  • Ngày thứ ba

Chỉnh sửa ssh_configlà quản trị viên (USE sudo). Bên trong ssh_config, loại bỏ các hash #trong các dòng ForwardAgent, ForwardX11, ForwardX11Trusted, và thiết lập các đối số tương ứng để yes.

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • Forth

Trong ssh_configtệp, xóa hàm băm #trước trước Port 22Protocol 2thêm một dòng mới ở cuối tệp để nêu vị trí tệp xauth XauthLocaion /usr/bin/xauth, hãy nhớ ghi đường dẫn của tệp xauth.

# /etc/ssh/ssh_config

#   IdentifyFile ...
    Port 22
    Protocol 2
#   Cipher 3des
#   ...
#   ...
    ...
    ...
    GSSAPIDelegateCredentials no
    XauthLocaion /usr/bin/xauth
  • Thứ năm

Bây giờ vì chúng tôi đã hoàn tất chỉnh sửa ssh_configtệp, hãy lưu nó khi chúng tôi rời khỏi trình chỉnh sửa . Bây giờ hãy vào thư mục ~hoặc $HOME, thêm export DISPLAY=localhost:0vào .bashrctập tin của bạn và lưu nó.

# ~/.bashrc
...
...
export DISPLAY=localhost:0
  • Cuối cùng

Chúng ta đang gần hoàn tất. Khởi động lại bash shell của bạn, mở Xmingchương trình của bạn và sử dụng ssh -X yourusername@yourhost. Sau đó tận hưởng môi trường GUI.

ssh -X yourusername@yourhost

Vấn đề cũng nằm ở hệ thống con Ubuntu trên Windows và liên kết là tại

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


3

Thêm X11UseLocalhost novào /etc/ssh/sshd_configvà khởi động lại máy chủ SSH.

Nếu bạn không có HIỂN THỊ, hãy kiểm tra xem xauth có được cài đặt chính xác không và sau đó thử lại.

RHE / CEntos không có vấn đề này, đây là một điều Ubuntu!


1

Đối với tôi, vấn đề là ở tùy chọn mount gật đầu cho hệ thống tập tin / tmp. X11 cần một tập tin đặc biệt để được tạo trong đó.

Vì vậy, hãy kiểm tra các tùy chọn gắn kết cho hệ thống tập tin / tmp là gì nếu bạn sử dụng một phân vùng hoặc đĩa riêng cho việc đó.


1
Tôi nghĩ rằng bạn có thể muốn xem các câu trả lời khác cho câu hỏi ban đầu và dành một chút thời gian để suy nghĩ câu trả lời của bạn cải thiện chúng như thế nào.
Sami Laine

1

Để thêm vào các câu trả lời xuất sắc trước đó (thiết lập ~/.ssh/configvà kiểm tra xem liệu DISPLAYbiến môi trường có được đặt trên máy khách không, thiết lập /etc/ssh/sshd_configvà cài đặt xauthtrên máy chủ), cũng đảm bảo xtermđược cài đặt trên máy khách, ví dụ:

sudo apt-get install xterm

1

xauth có thể bị khóa.

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

Sử dụng

xauth -b

Trên máy mà tôi đang cố gắng sshphá khóa xauth. Đăng xuất khỏi sshphiên sau khi phát hành xauth -bsau đó đăng nhập lại cuối cùng đã cho phép tôi thành công echo $DISPLAY. Chắc chắn thử điều này trước khi tạo lại.Xauthority


0

X11Forwardingphải được đặt trên máy chủ SSH (trong trường hợp của bạn là hộp Ubuntu) sshd_configvà bạn phải cho phép X11 được chuyển tiếp cho máy khách SSH (hộp Fedora của bạn) bằng cách chuyển -Xtùy chọn hoặc chỉnh sửa ssh_configtệp để thêm ForwardX11mặc định.


1
Bạn cũng cần xauthcài đặt trên máy từ xa, nếu không thì công cụ ủy quyền x sẽ không hoạt động.
Faheem Mitha

Còn cài đặt DISPLAYthì sao?
Ông Shickadance

1
ssh sẽ tự động thiết lập $DISPLAYnếu X11Forwardingđược bật và xauthcó mặt trên hệ thống máy khách.
Shadur

1
@Shadur Không dành cho tôi. Nó hoạt động khi tôi export DISPLAY=:10.0nhưng không khác. Nếu không, nó phàn nàn rằng nó không thể tìm thấy :0. Có lẽ một cái gì đó khác là cần thiết cho điều này xảy ra tự động?
cfr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.