Назад | Перейти на главную страницу

SSH: поведение SetEnv для переменной TERM

Я хочу установить для переменной среды TERM другое значение для каждой из моих удаленных машин, поэтому я использовал SetEnv TERM=myTermForRemoteVar в ~/.ssh/config. Удаленная машина все еще видит TERM=myLocalTermVar.

я добавил AcceptEnv TERM в /etc/ssh/sshd_config на удаленной машине. Все равно не повезло.

Я пробовал просто для тестирования SetEnv FOO=smth локально и AcceptEnv FOO. Это работает отлично, и удаленная машина видит FOO=smth.

Является TERM лечится специально по ssh? SetEnv работает в целом, но не для TERM. Кто-нибудь еще видел такое поведение? По крайней мере, это не задокументировано. Это ошибка?

Эта ветка на openssh-unix-dev похоже, указывает на то, что TERM действительно особенный, и вы не можете установить его через SetEnv. Вот мое прочтение вещей:

Как отмечено в этом потоке, когда клиент SSH запрашивает новый PTY от sshd, запрос включает явное TERM значение (см. RFC4254, «Протокол соединения Secure Shell (SSH)», раздел 6.2). Это отдельно от любых переменных среды, которые клиент хочет отправить.

В OpenSSH ssh.c, функция ssh_session2_setup, OpenSSH безоговорочно читает запрос PTY TERM ценность из вашей текущей среды, независимо от каких-либо SetEnv директивы. (Вы можете видеть переменные среды, в том числе из SetEnv, отправляются отдельно в clientloop.c, функция client_session2_setup.)

Затем на стороне сервера session.cс do_setup_env функция настраивает среду для новой оболочки в порядке, обратном тому, как ее отправляет клиент: первый он устанавливает переменные среды из s->env, затем это устанавливает TERM из запроса PTY TERM стоимость (s->term), перезаписывая любое значение для TERM отправляется как обычная переменная среды.

Из-за такого порядка операций на сервере SetEnv TERM всегда будет переопределено значением TERM в ssh окружение клиента, а не из любого SetEnv.

Кажется, есть веские аргументы в пользу изменения поведения OpenSSH в этом отношении в вышеупомянутой ветке, но я считаю, что из этого ничего не вышло. По крайней мере, один человек в этом потоке был убежден, что файлы инициализации удаленного хоста должны быть теми, которые нужно изменить. TERM если нужно. (Лично я не согласен.)