Я пытаюсь запустить команду через 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"
И это будет работать, но когда я попробую то же самое с here-document, это не сработает, и я получу ту же ошибку об отсутствии tty:
ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END
Есть идеи, как я могу заставить эту работу?
Кроме того, если вам интересно, почему я хочу, чтобы он работал с документом здесь, а не просто передавал его в той же строке, это потому, что команды ввода (их может быть несколько) поступают из файла конфигурации, читаемого сценарием и я слышал, что это позволяет избежать проблем с экранированием команд для кавычек, двойных кавычек и т. д.
Использовать visudo
чтобы отредактировать файл sudoers и вставить строку ниже:
Defaults:<user> !requiretty
Он не отвечает, зачем использовать
ssh -t "something" versus ssh -t <<STOP something STOP
не работает. Скажем, я не использую sudo, но использую passwd для своего пользователя напрямую, я все равно не получу TTY с помощью heredoc.
Пытаться ssh -t -t
для принудительного выделения псевдо-tty, даже если stdin не является терминалом.
Почему бы просто не сохранить здесь документ в переменной, которая будет задана 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