Ssh
在此處文件中通過 SSH 執行命令時不存在 TTY
我正在嘗試在此處的文件中通過 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"
它會起作用,但是當我用 here-document 嘗試同樣的事情時,它不起作用,並且我會收到關於不存在 tty 的相同錯誤:
ssh -t example.com <<END sudo /etc/init.d/apache2 reload END
知道我怎樣才能完成這項工作嗎?
另外,如果您想知道為什麼我希望它與 here-document 一起工作,而不是僅僅在同一行傳遞它,那是因為輸入命令(可能有幾個)來自腳本讀取的配置文件我聽說它避免了轉義引號、雙引號等命令的麻煩。
用於
visudo
編輯 sudoers 文件並插入以下行:Defaults:<user> !requiretty
它沒有回答為什麼使用
ssh -t "something" versus ssh -t <<STOP something STOP
不起作用。假設我沒有使用 sudo 但我直接為我自己的使用者使用 passwd,我仍然不會使用 heredoc 獲得 TTY。
ssh -t -t
即使 stdin 不是終端,也要嘗試強制分配偽 tty。
為什麼不簡單地將此處的文件儲存在將
ssh -t
作為命令參數給出的變數中。在更一般的說明中,
ssh -T
如果遠端主機的標準輸入從heredoc 重定向(以防止ssh
嘗試分配pty),則使用或指定遠端shell 作為命令參數。# 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