TTY отсутствует при запуске команд через SSH в здесь-документе
Я пытаюсь выполнить команду через SSH, как это в следующем документе:
ssh example.com <<END
sudo /etc/init.d/apache2 reload
END
Что обычно работает, за исключением случаев, когда я пытаюсь запустить что-то, что требует ввода, например, пароль для sudo. В этом случае я получаю следующее сообщение:
sudo: no tty present and no askpass program specified
Я знаю, что могу использовать -t
флаг SSH для выделения псевдо-tty, такого как этот:
ssh -t example.com "sudo /etc/init.d/apache2 reload"
И это сработает, но когда я попробую то же самое с здесь-документом, это не сработает, и я получу ту же ошибку об отсутствии tty:
ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END
Любая идея, как я могу сделать эту работу?
Кроме того, в случае, если вам интересно, почему я хочу, чтобы он работал с документом здесь, а не просто передавал его в одной строке, это потому, что входные команды (их может быть несколько) приходят из файла конфигурации, читаемого скриптом и я слышал, что это позволяет избежать проблем, связанных с использованием команд для кавычек, двойных кавычек и т. д.
2 ответа
Использование 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