Как выбрать порт DISPLAY при пересылке X через ssh

2537
Aaron

Это не вопрос о том, как пересылать X через ssh или как настроить DISPLAY, чтобы переадресованный X работал. Это другой вопрос - если вы оказались здесь в поисках ответа, просто сделайте еще один шаг, потому что 99% вопросов X DISPLAY вы найдете именно для этого.

Мой вопрос конкретно, как выбрать порт DISPLAY. То есть, если я ssh -X ...затем проверить дисплей с echo $DISPLAY, я мог видеть localhost:10.0или localhost:12.0или что - то подобное. Это не всегда то же самое каждый раз, как в предыдущем примере, где он содержит 10 один раз и 12 другой раз. Как выбрать, что это будет, вместо того, чтобы каждый раз быть полуслучайным? Я хочу заставить его всегда выбирать 10.0 или всегда 12.0 или что-то еще, если это соответствует.

Решение этой проблемы предпочтительно по-прежнему работает для нескольких дисплеев. У меня часто бывает 2 или 3 дисплея X-сервера - то есть: localhost: 10.0, localhost: 10.1, localhost: 10.2 - который ssh Xуспешно подключается и настраивается. Но опять же, он может использовать 10.0, 10.1, 10.2 или 12.0, 12.1, 12.2. Что бы это ни было, мне нужно, чтобы оно было последовательным.

Мой конкретный вариант использования: я использую программное обеспечение на работе, которое должно знать, где искать дисплеи. Каждый раз, когда ssh использует другое значение для DISPLAY, мне нужно зайти в файлы конфигурации для программного обеспечения и вручную изменить все записи. Это боль, и это действительно должна быть вещь типа «забей и забудь» - отсюда и мой вопрос.

Я думаю, что этот выбор сделан ssh на стороне сервера ssh (X-клиента). Я не думаю, что X-сервер знает или заботится о том, что локально X-клиент считает его «10.0» или что-то еще, что он использует. Пожалуйста, поправьте меня, если я ошибаюсь, поскольку я не уверен.

Я не вижу никакой опции для ssh, чтобы выбрать это значение.

Желательно, чтобы повышенные привилегии (root / admin) не требовались. Я не понимаю, почему они за это, но я просто заявляю об этом заранее. Если у вас есть ответ, для которого требуется root, это лучше, чем отсутствие ответа, и я мог бы его использовать.

0

1 ответ на вопрос

1
eggo

Я полагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что сервер ssh не может гарантировать, что кто-то еще не использовал (локально или удаленно переадресован) определенный номер дисплея (и порт), поэтому он должен выбрать тот, который открыт. Я не знаю точно, но я предполагаю, что он пытается открыть их последовательно и останавливается на первом, который откроется. Любые открытые порты дисплея (в том числе некоторые из них остаются незакрытыми из-за того, что старые процессы зависают) могут неограниченно открывать те, которые вы хотите открыть.

Хотя это не гарантия, вы можете попробовать установить другое значение для X11DisplayOffsetвашего сервера sshd_config. Это все еще не останавливает другого пользователя или даже ваш мошеннический процесс, когда первый доступный дисплей / порт X открыт.

В качестве альтернативы, вы можете попытаться установить DISPLAYпеременную вручную (на стороне сервера) для некоторого «необычного» номера или номера высокого порта в надежде, что вы сможете избежать обычно используемых портов с меньшим номером. например, выберите DISPLAY=:76, что означает порт, который вам нужно затем перенаправить порт 6076 обратно на ваш локальный X-сервер; Если вы не знали, TCP-порт X использует номер 6000 + DISPLAY (серверы VNC обычно используют 5900 + DISPLAY, IIRC). Вы могли бы выполнить ручную пересылку при вызове ssh, используя что-то вроде этого:

ssh -R6076:localhost:6000 server 

Это перенаправит порт 6076 на удаленном конце (сервере) обратно на локальный дисплей (при условии, что DISPLAY: 0). Недостатком этого подхода является то, что теперь вам приходится иметь дело со всеми вещами XAuth, которые sshделают для вас автоматически, используя -X (см. Этот пост для подсказок), но он должен работать. YYMV и скромные биты, оставленные читателю в качестве упражнения ;-).

Похожие вопросы