1

我正在尝试在远程机器上使用 sudo 运行命令。当我直接用

ssh -t -t -t myserver -q "sudo otheruser<<EOF
remotescript.sh
EOF"

它工作正常,但如果我在最后一行的末尾添加 & 则它不起作用。为什么?我怎样才能让它工作?

我实际上正在从本地脚本运行几个这样的命令(到不同的服务器),并将每个输出保存在不同的文件中,并希望它们异步运行。

注意:不能使用 otheruser@myserver 运行 ssh。登录后我真的需要运行 sudo 。

4

2 回答 2

1

从远程机器上的 sudo config (/etc/sudoers) 中删除requiretty 。

还要在 ssh 中添加 -f 选项,将命令置于后台(man:“必须在 ssh 在后台运行时使用”)。

使用 -f 时不需要“&”。

例如:

ssh -f -t -t -t myserver -q "sudo otheruser<<EOF
remotescript.sh
EOF"
于 2013-08-15T09:59:13.543 回答
0

使用 expect 来控制你的 ssh。它可用于对远程 shell 进行自动响应。大多数进程在异步运行时会自行挂起或在尝试从终端读取输入时被挂起,因为另一个前台进程(主 shell)正在使用它。

最近有一篇关于 ssh 和期望的帖子:https ://superuser.com/questions/509545/how-to-run-a-local-script-in-remote-server-using-expect-and-bash-script

还要尝试在将进程放在后台后将其与 disown 分开,以使其不受作业控制。例如

whole_command &
disown

将其输入更改为 /dev/null 也可能会有所帮助,但如果它确实需要用户输入,它可能会永远挂起。

whole_command <&- < /dev/null &
disown
于 2013-08-15T08:57:29.383 回答