TTY отсутствует при запуске команд через SSH в здесь-документе

10

Я пытаюсь выполнить команду через SSH, как это в следующем документе:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

Что обычно работает, за исключением случаев, когда я пытаюсь запустить что-то, что требует ввода, например, пароль для sudo. В этом случае я получаю следующее сообщение:

sudo: no tty present and no askpass program specified

Я знаю, что могу использовать -tфлаг SSH для выделения псевдотерминала, такого как этот:

ssh -t example.com "sudo /etc/init.d/apache2 reload"

И это сработает, но когда я попробую то же самое с здесь-документом, это не сработает, и я получу ту же ошибку об отсутствии tty:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

Любая идея, как я могу сделать эту работу?

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

lpfavreau
источник

Ответы:

6

Используйте visudoдля редактирования файла sudoers и вставьте строку ниже:

Defaults:<user>    !requiretty

Это не отвечает, почему использование ssh -t "something" versus ssh -t <<STOP something STOPне работает. Допустим, я не использую sudo, но я использую passwd для своего собственного пользователя, я все равно не получу TTY, используя heredoc.

Попробуйте ssh -t -tфорсировать псевдо-tty, даже если stdin не является терминалом.

кванты
источник
Спасибо, я видел это исправление в другом месте, но оно касается только тех команд, которые используют sudo. Это не отвечает, почему использование ssh -t «что-то» против ssh -t << STOP что-то STOP не работает. Допустим, я не использую sudo, но я использую passwd для своего собственного пользователя, я все равно не получу TTY, используя heredoc.
lpfavreau
Я обновил свой ответ.
кванты
1

Почему бы просто не сохранить документ здесь в переменной, которая будет указана ssh -tв качестве аргумента команды.

На более общем замечании, используйте ssh -Tили укажите удаленную оболочку в качестве аргумента команды, если stdin удаленного хоста перенаправляется из heredoc (чтобы предотвратить sshпопытки выделить pty).

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
Чад
источник