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
Другие вопросы по тегам