【问题标题】:Running ssh sudo asynchronously异步运行 ssh sudo
【发布时间】:2013-08-15 08:44:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我认为你错过了另一个"。它应该放在哪里?

标签: bash ssh sudo


【解决方案1】:

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

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

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

例如:

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

【讨论】:

  • 那里我也得到“sudo:对不起,你必须有一个 tty 才能运行 sudo”。
  • 好的,我错过了那条评论。你能从服务器上的 sudo config (/etc/sudoers) 中删除 requiretty 吗?
  • 我问过系统管理员,但我不指望它。
  • 你能运行 su 而不是 sudo 吗?
  • 我终于可以删除 requiretty :-) 不过我还是很想知道是否还有其他方法...
【解决方案2】:

使用 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

【讨论】:

  • 我不确定我是否安装了 expect,因为我不拥有这台机器。我试过 disown,但在第一种情况下它似乎不再运行,在第二种情况下它说:“sudo:对不起,你必须有一个 tty 才能运行 sudo”
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 2013-09-22
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2023-03-26
  • 2012-04-15
相关资源
最近更新 更多