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