Як переслати X через SSH для дистанційного запуску графічних програм?


342

У мене є машина під управлінням Ubuntu, до якої я SSH, зі своєї машини Fedora 14. Я хочу переслати X з машини Ubuntu назад до Fedora, щоб я міг віддалено запускати графічні програми. Обидві машини працюють в локальній мережі.

Я знаю, що -Xпараметр дозволяє пересилати X11 в SSH, але я відчуваю, що я пропускаю деякі етапи.

Які необхідні кроки для пересилання X з машини Ubuntu до Fedora через SSH?


6
Я знаю, що це досить часто, але у мене виникають проблеми. Остаточна відповідь на це питання була б корисною для багатьох. Багато прикладів навколо здаються важливими деталями.
Містер Шикаданс

Відповіді:


411

Переадресацію X11 потрібно включити як на стороні клієнта, так і на стороні сервера.

На стороні клієнта , то -X(капітал X) варіант sshвключає перенаправлення X11, і ви можете зробити це за замовчуванням (для всіх з'єднань або для конкретного Conection) з ForwardX11 yesв ~/.ssh/config.

На стороні сервера , X11Forwarding yesповинні вказані в /etc/ssh/sshd_config. Зауважте, що за замовчуванням немає переадресації (деякі дистрибутиви включають її за замовчуванням /etc/ssh/sshd_config), і що користувач не може змінити це налаштування.

xauthПрограма повинна бути встановлена на стороні сервера. Якщо там є якісь програми X11, велика ймовірність, що xauthвони будуть там. У тому, що навряд чи він xauthбув встановлений у нестандартному місці, його можна викликати через ~/.ssh/rc(на сервері!).

Зауважте, що вам не потрібно встановлювати жодні змінні середовища на сервері. DISPLAYі XAUTHORITYавтоматично буде встановлено їх відповідні значення. Якщо ви запустили ssh і DISPLAYне встановлено, це означає, що ssh не пересилає з'єднання X11.

Щоб підтвердити, що ssh пересилає X11, перевірте, чи є рядок, що міститься Requesting X11 forwardingу ssh -v -Xвисновку. Зауважте, що сервер не відповість жодним чином, запобіжна безпека приховування даних від потенційних зловмисників.


31
@user: Ні, вам ніколи не потрібно xhost +. xhostє ще з епохи ніжності, коли машина, підключена до мережі, означала, що ви надійні. xhost +означає, що кожен, хто може підробити ваш IP, може взяти під контроль ваш сеанс X-сервера. ssh -Xвстановить усі необхідні авторизації. Якщо перенаправлення X11 відключено в конфігурації сервера, поговоріть з адміністратором; якщо це не працює, див. Пересилання X11 через SSH, якщо конфігурація сервера не дозволяє .
Жиль

6
Дякуємо, що згадали про xauth! Відсутність цього сервера на босоніжних серверах викликала у мене неприємності.
vasi

5
+1, щоб зробити відмінність між одним ~/.ssh/configі /etc/ssh/sshd_configтим же місцем. Я не міг сказати, чи це різні файли чи просто зміна номенклатури.
puk

1
@KhurshidAlam Не має значення, чи також на сервері працює середовище GUI. Перевірте дозволи на .Xauthorityфайл. Якщо ви використовуєте Red Hat або іншу систему з SELinux, перевірте контекст SELinux, див. Unix.stackexchange.com/questions/36540/…
Gilles

8
після ssh -Xзапуску, xterm &щоб отримати графічний термінал як найкращий тест, щоб перевірити, чи працює він.
Олександр Тейлор

87

Щоб переадресація X11 працювала над ssh, вам знадобляться 3 речі.

  1. Ваш клієнт повинен бути налаштований для пересилання X11.
  2. Ваш сервер повинен бути налаштований для переадресації X11.
  3. Ваш сервер повинен бути в змозі налаштувати аутентифікацію X11.

Якщо у вас є і №1, і №2, але вони відсутні # 3, ви отримаєте порожню змінну середовища DISPLAY.

Суп-до-горіхів, ось як зробити переадресацію X11.

  1. На своєму сервері переконайтесь, що / etc / ssh / sshd_config містить:

    X11Forwarding yes
    X11DisplayOffset 10
    

    Можливо, вам знадобиться SIGHUP sshd, щоб він зміняв ці зміни.

    cat /var/run/sshd.pid | xargs kill -1
    
  2. На своєму сервері переконайтеся, що у вас встановлено xauth.

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

    Якщо у вас не встановлено xauth, ви зіткнетеся з проблемою "порожня змінна середовище DISPLAY".

  3. Підключіться до свого клієнта до свого сервера. Обов’язково скажіть ssh, щоб дозволити переадресацію X11. я віддаю перевагу

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

але вам може сподобатися

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

або ви можете встановити це у ~ / .ssh / config.


Я працював у цій порожній змінній середовища DISPLAY раніше сьогодні, коли ssh'ing на новий сервер, який я не адмініструю. Відстеження пропалої частини xauth було трохи весело. Ось що я зробив, і що ви теж можете зробити.

На своїй локальній робочій станції, де я адміністратор, я перевірив, що / etc / ssh / sshd_config налаштований для пересилання X11. Коли я повертаю ssh -X до localhost, я отримую правильно встановлений DISPLAY.

Змусити DISPLAY вимкнутись було не надто важко. Мені просто потрібно було дивитись, що роблять sshd та ssh, щоб правильно встановити його. Ось повний підсумок всього, що я робив на цьому шляху.

    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

Замість використання sudo для примусового копіювання файлів ssh_host_ {dsa, rsa} _key, я використовував ssh-keygen для створення манекенів для себе.

    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.

Промийте-повторіть за допомогою -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

Відредагуйте ~ / dummy-sshd / sshd_config, щоб вказати на нові правильні файли ключів ssh_host.

    # 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

Запустіть sshd на новий порт у режимі, що не відключається:

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

Ну, краще виправте цей шлях:

    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.

Поставте новий термінал і вставте в localhost на порт 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

Подивіться останні три рядки там. У мене випадково було встановлено DISPLAY, і були ці дві красиві лінії від / usr / bin / xauth.

Звідти це було дитячою грою, щоб перейти вбік мого / usr / bin / xauth до /usr/bin/xauth.old, відключитися від ssh та зупинити sshd, а потім запустити sshd та ssh назад до localhost.

Коли / usr / bin / xauth пішов, я не побачив відображення відображення в моєму оточенні.


Тут немає нічого блискучого. Переважно мені пощастило у виборі розумного підходу, щоб спробувати відтворити це на своїй локальній машині.


1
Вау, спасибі тобі велике за твою передвість. Я робив все добре, окрім export DISPLAY=:10. Я ніколи не здогадувався про таку кількість дисплеїв.
erm3nda

Це зсув дисплея 10! : D
41754

33

Переконайтесь, що:

  • Ви xauthвстановили на сервер (див.: xauth info/ xauth list).
  • На сервері вашого /etc/ssh/sshd_configфайлу є такі рядки:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • На стороні клієнта у вашому ~/.ssh/configфайлі є такі рядки:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • На стороні клієнта встановлено сервер X (наприклад, macOS: XQuartz; Windows: Xming).


Потім, щоб переадресувати X11 за допомогою SSH, потрібно додати -Xдо своєїssh команди, наприклад

ssh -v -X user@host

переконайтеся , що ваш DISPLAYє НЕ порожнім шляхом:

echo $DISPLAY

Якщо це так, то, маючи багатослівний параметр для ssh ( -v), перевірте, чи немає попереджень, наприклад

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

Якщо у вас є ненадійний X11, як показано вище, спробуйте -Yпоставити прапорець (якщо ви довіряєте хосту):

ssh -v -Y user@host

Див.: Що означає "Попередження: невдала настройка перенаправлення X11 не вдалася: дані ключа xauth не генеруються" означають, коли ssh'ing з -X?


Якщо ви попереджаєте: Немає даних xauth , ви можете спробувати створити новий .Xauthorityфайл, наприклад

xauth generate :0 . trusted
xauth list

Див.: Створення / відновлення нового файлу .Xauthority


Якщо у вас є інші попередження, ніж вище, дотримуйтесь подальших підказок.



1
Остаточний посібник: Конфігурація на стороні клієнта відзначила різницю
користувач2928048

2
та X11UseLocalhost немає на стороні сервера
користувач2928048

17

Виправлення полягає в тому, щоб додати цей рядок до своїх /etc/ssh/sshd_config:

X11UseLocalhost no

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


У мене є 2 сервери Ubuntu. На одному мені потрібно було встановити так, на іншому це повинно бути ні. Я впевнений, що є пояснення, але варто спробувати і те, і інше.
alfonx

1
Це виправлення працювало для мене !!
рігон

3
Будь ласка, уточніть, чи ви хочете розмістити це налаштування на сервері чи клієнті
Klik

5

Запуск Ubuntu в Windows 10 працює, ssh -X щоб отримати середовище GUI на віддаленому сервері

  • Спочатку

Встановіть усе наступне. У вікні встановіть Xming. Для Ubuntu bash використовуйте sudo apt installдля встановлення ssh xauth xorg.

sudo apt install ssh xauth xorg
  • Друге

Перейдіть до папки, що містить ssh_configфайл, моя є /etc/ssh.

  • Третя

Редагувати ssh_configяк адміністратор (USE sudo). Всередині ssh_config, видалити хеш #в рядках ForwardAgent, ForwardX11, ForwardX11Trustedі встановити відповідні аргументи yes.

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • Четвертий

У ssh_configфайлі видаліть передній хеш #до Port 22і Protocol 2, а також додайте новий рядок в кінці файлу, щоб вказати розташування файлу xauth XauthLocaion /usr/bin/xauth, не забудьте написати свій власний шлях до файлу xauth.

# /etc/ssh/ssh_config

#   IdentifyFile ...
    Port 22
    Protocol 2
#   Cipher 3des
#   ...
#   ...
    ...
    ...
    GSSAPIDelegateCredentials no
    XauthLocaion /usr/bin/xauth
  • П'ятий

Тепер, коли ми закінчили редагування ssh_configфайлу, збережіть його, коли вийдемо з редактора. Тепер перейдіть до папки ~або $HOME, додайте export DISPLAY=localhost:0до свого .bashrcфайлу і збережіть його.

# ~/.bashrc
...
...
export DISPLAY=localhost:0
  • Остання

Ми майже готові. Перезапустіть bash shell, відкрийте Xmingпрограму та використовуйте ssh -X yourusername@yourhost. Потім насолоджуйтесь середовищем GUI.

ssh -X yourusername@yourhost

Проблема також в підсистемі Ubuntu в Windows, і посилання знаходиться на

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


3

Додати X11UseLocalhost noдо /etc/ssh/sshd_configі перезапустити сервер SSH.

Якщо у вас немає дисплея, перевірте, чи встановлено xauth правильно та повторіть спробу.

RHE / CEntos не має цієї проблеми, це Ubuntu!


1

Для мене проблема полягала в опції кріплення nodev для / tmp файлової системи. X11 потрібен спеціальний файл, щоб створити там.

Тому перевірте, які параметри кріплення для / tmp файлової системи, якщо ви використовуєте для цього окремий розділ або диск.


1
Думаю, ви можете побачити інші відповіді на початкове запитання та задуматися, як покращиться ваша відповідь на них.
Самі Лайн

1

Щоб додати до попередніх відмінних відповідей (налаштування ~/.ssh/configта перевірка того, чи встановлена DISPLAYзмінна середовище для клієнта, налаштування /etc/ssh/sshd_configта встановлення xauthна сервері), також переконайтеся, що xtermвстановлено на клієнті, наприклад

sudo apt-get install xterm

1

xauth може заблокуватися.

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

Використання

xauth -b

На машині, в яку я намагався sshввірватися, зламався замок xauth. Вихід із sshсеансу після видачі, xauth -bпотім вхід у систему, нарешті, дозволив мені успішно echo $DISPLAY. Однозначно спробуйте це перед повторним створенням.Xauthority


0

X11Forwardingнеобхідно встановити на сервері SSH (у вашому випадку вікно Ubuntu) sshd_config, і ви повинні дозволити пересилання X11 для клієнта SSH (вашого поля Fedora), передавши -Xпараметр або відредагувавши ssh_configфайл, щоб додати ForwardX11типовий параметр.


1
Вам також потрібно xauthвстановити на віддаленій машині, інакше х повноваження не працюють.
Faheem Mitha

Що з налаштуванням DISPLAY?
Містер Шикаданс

1
ssh автоматично встановлюється, $DISPLAYякщо X11Forwardingвін включений і xauthприсутній у клієнтській системі.
Шадур

1
@Shadur Не для мене. Це працює, коли я, export DISPLAY=:10.0але не інакше. В іншому випадку він скаржиться, що не може знайти :0. Може, потрібно щось інше, щоб це відбулося автоматично?
cfr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.