Тут немає документа 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 для виділення такої псевдо-tty:

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

І воно буде працювати, але коли я спробую те ж саме з тут-документом, він не працює, і я отримаю ту саму помилку, що немає жодного tty:

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

Будь-яка ідея, як я можу зробити цю роботу?

Крім того, якщо вам цікаво, чому я хочу, щоб він працював з документом here, замість того, щоб просто передати його в одному рядку, це тому, що команди введення (їх може бути декілька) надходять із файлу конфігурації, прочитаного сценарієм і я чув, що це дозволяє уникнути неприємностей уникнути команд для лапок, подвійних лапок тощо.

Відповіді:


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 не працює. Скажімо, я не використовую sudo, але я використовую passwd для власного користувача безпосередньо, я все одно не отримаю TTY за допомогою heredoc.
lpfavreau

Я оновив свою відповідь.
кванта

1

Чому б просто не зберігати тут документ у змінній, яка буде задана ssh -tяк аргумент команди.

У більш загальній примітці використовуйте ssh -Tабо вкажіть віддалену оболонку як аргумент команди, якщо stdin віддаленого хоста перенаправляється з гередока (щоб запобігти 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.