Итак, у меня есть файл конфигурации SSH для моего пользователя, который используется Match exec
для получения некоторых совпадений по IP:
Match exec "echo %h | grepcidr 192.168.12.0/20 &>/dev/null "
User ubuntu
ProxyCommand ssh my-bastion -W %h:%
IdentityFile ~/.ssh/target.pem
Это отлично работает на моем хосте, но я попытался запустить его в контейнере, где установлен openssh-client, однако соединение ssh не устанавливается, поскольку он считает, что команда выполнена успешно (даже если я не обращаюсь к сети), поэтому он попытается пройти через бастион.
debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 0
На моем хосте он возвращается
debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 1
Что должно быть тем, что возвращает команда ssh контейнера
Я копал, и оказалось, что команда ssh в контейнере запускается с помощью , sh -c
тогда как команда ssh, запущенная на моем хосте, — . bash -c
Я могу подтвердить, что это причина, протестировав и командную строку, и проверив возврат команды с помощьюecho $?
Есть ли способ указать команде ssh использовать только bash
?
Я могу переопределить SHELL
переменные окружения в начале командной строки
SHELL=/bin/bash ssh [email protected]
Но моя цель — использовать ansible для всего этого, поэтому я хотел бы перепроверить оболочку для всех SSH.
решение1
Вы можете либо указать альтернативную команду, которая начинается с bash -c
, либо отказаться от своего Bashism (а именно &>
перенаправления stdout-and-stderr).
Использует Match exec
что-то вроде system()
функции C, поэтому система выполнения (библиотека C) решает, какую оболочку она предоставляет. В большинстве систем Unix она транслируется в sh -c
plus всю командную строку. Эту часть изменить нельзя.