在here-document中通过SSH运行命令时不存在TTY

我试图通过SSH在这里的文档中运行一个命令:

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

除了当我试图运行一些需要input的东西,比如sudo的密码,这通常是正常的。 在这种情况下,我收到以下消息:

 sudo: no tty present and no askpass program specified 

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

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

它会工作,但是当我用这里的文档尝试同样的事情,它不起作用,我会得到同样的错误关于没有tty存在:

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

任何想法如何我可以使这项工作?

此外,如果您想知道为什么我希望它与这里的文档工作,而不是只是在同一行上传递它,这是因为input命令(可以有一些)来自脚本读取的configuration文件我听说它避免了转义引号,双引号等命令的麻烦。

使用visudo编辑sudoers文件并插入下面的行:

 Defaults:<user> !requiretty 

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

尝试使用ssh -t -t来强制伪tty分配,即使stdin不是terminal。

为什么不简单地将这里的文档存储在一个variables中,该variables将被赋予ssh -t作为命令参数。

在更一般的说明中,如果远程主机的stdin被从heredocredirect(防止ssh尝试分配一个pty),请使用ssh -T或将远程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