在此处文档中通过 SSH 运行命令时不存在 TTY

lpf*_*eau 10 ssh bash sudo

我正在尝试在此处的文档中像这样通过 SSH 运行命令:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END
Run Code Online (Sandbox Code Playgroud)

这通常有效,除非我尝试运行需要输入的内容,例如 sudo 的密码。在这种情况下,我收到以下消息:

sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用-tSSH 上的标志来分配一个伪 tty,例如:

ssh -t example.com "sudo /etc/init.d/apache2 reload"
Run Code Online (Sandbox Code Playgroud)

它会起作用,但是当我用 here-document 尝试同样的事情时,它不起作用,我会得到关于没有 tty 的相同错误:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END
Run Code Online (Sandbox Code Playgroud)

知道我怎样才能使这项工作?

另外,如果您想知道为什么我希望它与 here-document 一起使用而不是仅仅在同一行上传递它,那是因为输入命令(可能有几个)来自脚本读取的配置文件我听说它避免了转义引号、双引号等命令的麻烦。

qua*_*nta 6

使用visudo到编辑sudoers文件,并插入下面一行:

Defaults:<user>    !requiretty
Run Code Online (Sandbox Code Playgroud)

它没有回答为什么使用ssh -t "something" versus ssh -t <<STOP something STOP不起作用。假设我没有使用 sudo 但我直接为我自己的用户使用 passwd,我仍然不会使用 heredoc 获得 TTY。

ssh -t -t即使 stdin 不是终端,也要尝试强制伪 tty 分配。