У меня есть headless VM (работающая под управлением Ubuntu server 17.04), к которой я подключаюсь через SSH. Я хорошо разбираюсь в основах переадресации X11 и могу нормально пересылать xterm и его друзья. Терминал XFCE также пересылает нормально.
Я хотел бы иметь возможность использовать терминал Gnome, но он, похоже, не запускается. Вместо этого он просто зависает на некоторое время и в конечном итоге выдает ошибку:
Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: Error calling StartServiceByName for org.gnome.Terminal: Timeout was reached
Интересно, что gnome-terminal работает удаленно через X11, если на моей виртуальной машине запущен локальный сеанс рабочего стола (запущенный через startx).
Я предполагаю, что есть какая-то служба Gnome, которую нужно запустить, но я не могу понять, что это такое или как запустить ее вне контекста полноценного сеанса рабочего стола. Обычно я их не запускаю, потому что виртуальная машина по умолчанию безголовая.
Кто-нибудь знает, что можно сделать, чтобы Gnome-terminal работал удаленно, без необходимости запускать сеанс графического интерфейса рабочего стола локально на моей виртуальной машине?
решение1
Это не работает, потому что gnome-terminal
(как и любой другой)gnome-thing
) попытается подключиться к dbus и потерпит неудачу, не получив ответа в течение длительного времени.
Самый простой способ обойти эту проблему — просто запустить экземпляр dbus для вашего сеанса:
export $(dbus-launch)
gnome-terminal
Если вы началиУэйландсессия поудаленныймашина, поскольку вы впервые запустили export $(dbus-launch)
, вам придется запустить его снова, или, если нет, gnome-terminal
запустится экземпляр Wayland gnome-terminal
на удаленном дисплее вместо экземпляра X11 на вашем перенаправленном дисплее.
Другим обходным путем в этом случае является явный запуск X11 gnome-terminal-server
, который завершится после закрытия последнего окна, использующего его. Пример:
#! /bin/bash
ID=foo.bar$RANDOM
GDK_BACKEND=x11 /usr/libexec/gnome-terminal-server --app-id "$ID" &
sleep .4 # yuck
gnome-terminal --app-id "$ID"
wait
решение2
Это можно сделать в обычных Ubuntu или Debian, используя всего лишь:
ssh -X user@host dbus-launch gnome-terminal
В моих заметках есть общие флаги, касающиеся dbus-launch
: --exit-with-x11
или--exit-with-session
Остается проблема в том, что загрузка займет некоторое время.
По моему мнению, это похоже на то, что локальное gnome-terminal
взаимодействие с удаленным устройством gnome-terminal-server
требует извлечения кода и его модификации, но это довольно простое программное обеспечение, слишком простое.
Редактировать: Кроме того, вы можете сделать это, не требуя x11-dbus
пакет (который по умолчанию отсутствует в Ubuntu, хотя он и небольшой).
Это работает не на всех gnome-terminal
версиях, но я проверил на Ubuntu 22 и Debian 11, и это работает.
ssh -X user@host gnome-terminal --disable-factory
Различия между этими подходами выходят за рамки стиля/длины терминальной команды.
Первоначальный подход dbus-launch
запустит gnome-terminal
экземпляр в соответствии gnome-terminal-server
с тем, как он взаимодействует с удаленной машиной.
Однако этот --disable-factory
подход запустит gnome-terminal
экземпляр, который более эффективно работает, например, с док-станцией Ubuntu 22.
Надеюсь, что один из этих двух вариантов удовлетворит ваши требования. Есть и другие подходы, но, по моему мнению, эти самые лучшие из-за своей простоты.
решение3
В вашем простом случае переадресации X11 из одного сеанса см. https://askubuntu.com/a/1279065/463121
после входа в систему:
$ dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY
и тогда gnome-terminal будет быстрым и отлично пересылает данные по X11.
Если что-то пойдет не так, возможно, зависли персональные демоны dbus. Если вы можете завершить все пользовательские процессы и войти в систему снова, то все в порядке.
EDIT: Или даже:
$ dbus-update-activation-environment --all
решение4
Запуск приложения через X может быть очень медленным.
У меня был большой успех с туннелированием VNC через SSH с клиентскими системами по всему миру.
На удаленной машине установите VNC-сервер, например tigervnc, и запустите демон. (yum install -y tigervnc-server ; vncserver :3 -или любой другой порт, который вы хотите использовать). Вам будет предложено задать пароль.
На локальной машине установите клиент VNC (yum install -y tigervnc). Вы можете добавить "exec /usr/bin/gnome-terminal" в файл ~/.vnc/xstartup. Затем выполните: ssh -L 5903:localhost:5903 -N -f -l user удаленный-сервер-IP-или-имя-хоста Номер порта здесь будет 59, а выбранный вами номер порта
В другом терминале выполните: vncviewer :3
Вам будет предложено ввести пароль, установленный на сервере.