Когда я ssh
захожу на сервер, как я могу передать переменную окружения от клиента к серверу? Эта переменная окружения изменяется между различными вызовами ssh, поэтому я не хочу перезаписывать $HOME/.ssh2/environment
каждый раз, когда выполняю ssh-вызов. Как я могу это сделать?
ssh
environment-variables
Росс Роджерс
источник
источник
ssh
страницы руководства я не вижу другого способа сделать это, кроме установки переменной вручную после входа на сервер, если только вы не изменили ~ / .ssh2 / environment.Ответы:
Конечно, вы можете установить переменную окружения внутри команды, однако вы должны быть осторожны с цитированием: помните, что ваша оболочка будет анализировать вашу локальную командную строку, и тогда удаленная оболочка будет использовать строку получает.
Если вы хотите, чтобы переменная получала то же значение на сервере, что и на клиенте, попробуйте
SendEnv
параметр:Это требует поддержки со стороны сервера. В OpenSSH имя переменной должно быть авторизовано в
/etc/sshd_config
.Если сервер допускает только определенные имена переменных, вы можете обойти это; например, обычная настройка позволяет
LC_*
, и вы можете сделать следующее:Если даже
LC_*
это не вариант, вы можете передать информацию вTERM
переменную окружения, которая всегда копируется (однако может быть ограничение длины). Вам все равно придется убедиться, что удаленная оболочка не ограничиваетTERM
переменную для обозначения известного типа терминала. Передайте-t
параметр ssh, если вы не запускаете удаленную интерактивную оболочку.Другая возможность - определить переменную непосредственно в команде:
Таким образом, если передать локальную переменную:
Однако остерегайтесь проблем с цитированием: значение переменной будет интерполировано непосредственно во фрагмент оболочки, выполненный на удаленной стороне. Последний пример выше предполагает, что
$LOCALVAR
не содержит каких-либо одинарных кавычек ('
).источник
AcceptEnv
указанием директив поsshd_config
желанию администратора. НоTERM
лечится особо, насколько я знаю, нет способа отфильтровать его на стороне сервера (он устанавливается в среде оболочки независимо от какого-либо параметра конфигурации). Вы уверены, что нет сценария профиля, переопределяющего его (как/etc/profile
или~/.profile
или~/.bashrc
)?TERM
передается только в том случае, если клиент просит сервер выделить tty. Если на удаленной стороне нет терминала, его бесполезно передаватьTERM
. Когда вы указываете команду, если вы хотите иметь терминал на удаленной стороне, вам нужна-t
опция командной строки (илиRequestTTY
in~/.ssh/config
).Если вы можете администрировать целевой хост, вы можете настроить sshd, чтобы разрешить передачу локальных переменных среды на целевой хост.
Со страницы руководства sshd_config:
конфигурация sshd обычно живет в
/etc/ssh/sshd_config
источник
Итак, на вашем клиенте есть переменная окружения, и вы хотите, чтобы она была доступна для удаленной команды? Я не думаю, что есть способ заставить ssh волшебным образом передать это, но вы, вероятно, можете сделать что-то подобное. Вместо того, чтобы использовать, скажем:
Ты можешь сделать это:
источник
Ответ @ emptyset (который мне не помог) привел меня к такому ответу:
Вы можете добавить эту команду в свой
~/.ssh/authorized_keys
файл:export VARIABLE=<something>
был немедленно завершен, и SSH-соединение было закрыто (заблокировав меня из-за сервера), в то время как/usr/bin/env ... $SHELL
оболочка по умолчанию будет работать с измененной средой.источник
$SHELL
реальную оболочку? Также проверьте, что / usr / bin / env существует на сервере. Однако решение не является идеальным: я заметил, что оно зависало, когда я хотел использоватьscp
или встроенную команду.PermitUserEnvironment yes
и использоватьenvironment="..."
вместоcommand="..."
.На вашем локальном клиенте, в вашем
~/.ssh/config
вы можете добавитьSetEnv
, например,Примечание: проверьте
man ssh_config
.Затем на сервере обязательно разрешите клиенту передавать определенные переменные окружения в вашем
/etc/ssh/sshd_config
конфигурационном файле:Примечание: проверьте
man sshd_config
.источник
Вы могли бы попытаться вызвать пользовательскую команду, предполагая, что у вас есть настройка входа по ssh без пароля. На сервере отредактируйте запись ~ / .ssh / authorized_keys, которая соответствует ключу вашего клиента:
Посмотрите на эту ссылку в разделе « Принудительное командование» для более подробной информации.
источник
Я делал пользовательскую сборку OpenSSH для устройства с cramfs в домашнем каталоге и / etc (Cram FS только для чтения), поэтому ~ / .ssh / environment не будет работать без перестройки всей FS, и они были развернуты на местах устройства (встроенные системы, следовательно, использование CRAMFS). Вы можете указать в sshd_config местоположение файла authroized_keys, но по какой-то причине среда работает только для переменных среды в ~ / .ssh / authroized_keys. Редактирование / etc / profile не было вариантом, и мне пришлось загружать ssh в нестандартный каталог. В session.c после child_set_env (... "MAIL" ...) просто добавьте переменные окружения, которые вам нужны (это хак, я знаю ...), но просто добавьте, что кому-то нужны жестко закодированные envs для сеанса, если вы компиляция из источника вы можете сделать это. TGI-FLOSS
источник
только одна простая команда:
источник