异步运行ssh sudo

时间:2013-08-15 08:44:08

标签: bash ssh sudo

我试图在远程计算机上使用sudo运行命令。当我直接用

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

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

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

注意:使用otheruser @ myserver运行ssh不是一个选项。我登录后确实需要运行sudo。

2 个答案:

答案 0 :(得分:1)

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

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

“&amp;”使用-f。

时不需要

E.g:

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

答案 1 :(得分: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

也可以尝试在将其放置在背景上时拒绝您的进程,并使其不被作业控制。 e.g。

whole_command &
disown

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

whole_command <&- < /dev/null &
disown