Переопределить оболочку для команд в конфигурации ssh (~/.ssh/config)

Переопределить оболочку для команд в конфигурации ssh (~/.ssh/config)

Итак, у меня есть файл конфигурации 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 -cplus всю командную строку. Эту часть изменить нельзя.

Связанный контент