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


10

我试图在here-document中通过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一起使用,而不是仅将其传递在同一行上,那是因为输入命令(可能有几个)来自脚本读取的配置文件而且我听说它避免了转义引号,双引号等命令的麻烦。

Answers:


6

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

Defaults:<user>    !requiretty

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

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


谢谢,我在其他地方也看到了此修复程序,但是它只能解决使用sudo的命令的问题。它没有回答为什么使用ssh -t“ something”与ssh -t << STOP STOP不能正常工作。假设我没有使用sudo,而是直接为自己的用户使用passwd,但我仍然无法使用Heredoc获得TTY。
lpfavreau 2011年

我已经更新了答案。
量子

1

为什么不简单地将here文档存储在将ssh -t作为命令参数给出的变量中。

更一般地讲,ssh -T如果要从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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.