Ssh

在此處文件中通過 SSH 執行命令時不存在 TTY

  • February 11, 2014

我正在嘗試在此處的文件中通過 SSH 執行這樣的命令:

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

這通常有效,除非我嘗試執行需要輸入的內容,例如 sudo 的密碼。在這種情況下,我收到以下消息:

sudo: no tty present and no askpass program specified

我知道我可以使用-tSSH 上的標誌來分配一個偽 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

引用自:https://serverfault.com/questions/315150