ssh SendEnv не работает при использовании с -J (хост перехода)?
Изменить: подсказка по перезапуску ssh после редактирования /etc/ssh/sshd_config решила мою проблему (sudo systemctl restart ssh.service
в Ubuntu), но посмотрите принятый ответ, где вы найдете гораздо больше полезной информации по устранению неполадок.
Оригинал:
У меня есть сервер, к которому я подключаюсь через хост перехода:
export MY_ENV=myvalue
ssh -o StrictHostKeyChecking=yes -o SendEnv=MY_ENV -J <myuser@jumpHostIp> <myuser@hostIp>
И хост перехода, и хост имеют в своем /etc/ssh/sshd_config:
AcceptEnv MY_ENV
И хост перехода, и хост имеют в своих /home/myuser/.ssh/authorized_keys ключ ssh, ограничивающий myuser сценарием развертывания:
command=/home/myuser/deploy.sh ...rest of public key...
Внутри этого файла Deploy.sh я хотел бы использовать $MY_ENV, однако это не работает.
При использовании хоста перехода каким-то образом теряется значение MY_ENV, передаваемое SendEnv? Если да, так ли это и как я могу получить доступ к значению MY_ENV в Deploy.sh на хосте?
1 ответ
Изменить: я уточнил детали, рассмотренные в ходе нашего итерационного процесса, частично дублируя некоторые детали, уже упомянутые в вопросе, для лучшего общего использования.
На странице руководства ssh указано:
Обратите внимание, что директивы конфигурации, представленные в командной строке, обычно применяются к целевому хосту, а не к каким-либо указанным хостам перехода. Используйте ~/.ssh/config для указания конфигурации хостов перехода.
Таким образом, ваш конечный пункт назначения получит опции, добавленные-o
. Поскольку параметры не затрагиваются хостом перехода, нет необходимости настраивать хост перехода для передачи переменных на хост назначения.
Конфигурация sshd на целевом сервере
В качестве предварительного условия служба sshd целевого хоста должна быть настроена на прием переменной среды. Допускаются подстановочные знаки:
Файл:/etc/ssh/sshd_config
AcceptEnv MY_*
После изменения sshd необходимо перезапустить, чтобы прочитать обновленную конфигурацию.
(решение этого вопроса...)
systemctl restart sshd
Текущее соединение сохранится при перезапуске sshd (по крайней мере, при использовании «openssh-server»
ловушка в
Чтобы ограничить использование ключа в целевой системе, к авторизации можно добавить опцию.
Файл:authorized_keys
с ограничением по команде
Вся аутентификация PublicKey завершится неудачей, если опустить кавычки, заключающие значениеcommand
вариант:
command=/home/user/deploy.sh ssh-rsa AAAAB3NzaC1yc2EAA...
# DEBUG response of sshd:
debug1: /home/user/.ssh/authorized_keys:1: bad key options: missing start quote
В зависимости от настроек вsshd_config
возврат к аутентификации на основе пароля, соответственноPermission denied (publickey).
будет следовать.
Кавычки обязательны, даже если в команде нет пробелов:
command="/home/user/deploy.sh" ssh-rsa AAAAB3NzaC1yc2EAA...
Детали для команды клиента
Примечание. Помимо параметров командной строки, эти данные можно настроить у пользователя клиента.
~/.ssh/config
.
Чтобы передать нужную переменную в качестве опции в командной строке, возможны два варианта синтаксиса:
-o SendEnv=MY_ENV
-o "SendEnv MY_ENV"
Пожалуйста, не забывайте
"
кавычки.
Для доступности переменной важно не только установить ее, но и экспортировать:
Это не удастся:
MY_ENV="Value"
echo $MY_ENV
Value
... несмотря на то, что переменная отображается в текущей оболочке.
Необходимый:
export MY_ENV="Value"