Обнаружение ошибок, связанных с сеансом экрана GNU, который туннелирует X по SHH

После туннелирования X через SSH-соединение с использованием экрана на пульте дистанционного управления, как я могу заново подключить сеанс экрана с другой машины и туннеля X к этой другой машине?

Я либо получаю ошибки типа "не могу открыть дисплей", либо приложение туннелирует к первому компьютеру. Я предполагаю, что это связано с переменными ENV в сеансе экрана, но я не уверен, как исправить ошибку.

1 ответ

Решение

При использовании экрана вам придется скопировать необходимые переменные среды вручную.

Отсоединиться от экрана сеанса, запустить echo $DISPLAY и скопируйте значение.

Теперь присоедините и запустите export DISPLAY="copied value",


При создании сеанса Screen сервер экрана автоматически наследует копию текущей среды, которая в дальнейшем наследуется оболочками или другими процессами, которые вы запускаете в новых окнах Screen внутри сеанса.

xterm                        (DISPLAY=":0")
└── bash                     (DISPLAY=":0")
    └── screen (client)      (DISPLAY=":0")
        └── SCREEN (server)  (DISPLAY=":0")
            ├── irssi        (DISPLAY=":0")
            ├── mutt         (DISPLAY=":0")
            └── bash         (DISPLAY=":0")

Когда вы подключаетесь по SSH с включенной переадресацией X11, сервер SSH устанавливает $DISPLAY переменная окружения, указывающая на ваш сервер X11.

Однако при повторном подключении к сеансу Screen процессы, выполняющиеся внутри этого сеанса, не увидят его; они все еще держат копии старой среды.

sshd                         (DISPLAY="localhost:12")
└── bash                     (DISPLAY="localhost:12")
    └── screen (client)      (DISPLAY="localhost:12")

SCREEN (server)              (DISPLAY=":0")
├── irssi                    (DISPLAY=":0")
├── mutt                     (DISPLAY=":0")
└── bash                     (DISPLAY=":0")

Это связано с тем, что процессу не разрешено обновлять среды других процессов; только о себе. Хотя процесс экранного клиента имеет новую среду, он не может передать его серверу экрана; протокол, используемый Screen просто не имеет такой функции.

Некоторые другие мультиплексоры, такие как tmux, разрешают клиентам отправлять копию своей среды на сервер после присоединения. Это не совсем эффективно; он только позволяет вновь открытым окнам tmux наследовать новую среду, но все равно не может ничего сделать с уже запущенными окнами.

Другие вопросы по тегам