我正在运行以下 SSH 命令:
ssh "root@$ip" 'nohup sh -s' < ./do_sync &
do_sync
我的目标是在远程主机上执行(shell 脚本)的内容。我这样做是因为,出于我不会详细讨论的原因,我无法将实际的脚本文件传输到该机器并在那里执行它。
不确定是否相关,但远程计算机实际上是 Android x86 设备。不过,我并没有在上面做任何与 Android 相关的事情。 Java VM 甚至没有运行。它只是 Linux 的 Android 版本,上面有一些 busybox 实用程序。它没有bash
,而且sh
它使用的似乎非常基本/旧。我不确定它是否完全符合 POSIX 标准。直到现在我才遇到了获得我想要的行为的问题,所以为了以防万一它与操作系统相关,我想提一下这个细节。
此命令有效,但该ssh
进程在后台保持活动状态。我期望发生的是这样的:
- 在后台执行SSH命令,以便脚本立即返回。
- SSH 命令应该连接到主机,执行
sh -s ...
命令并立即返回。 - 步骤 1 中的 SSH 进程应该结束
有人可以帮助我获得这种行为吗?请注意,我执行所有这些操作的机器有 bash 和较新版本的 sh。但远程 SSH 主机没有 bash,只有非常旧版本的sh
.不确定这是否重要,但我想无论如何我都会分享。
编辑1
我也尝试过这个,但行为是相同的:
cat ./do_sync | ssh "root@$ip" &
编辑:意识到这是无效的,因为我省略了该nohup
部分,但这最终具有相同的阻止行为:
cat ./do_sync | ssh "root@$ip" "nohup sh -s"
编辑2
也尝试过这个,仍然阻止 SSH 连接断开:
commands="$(cat ./do_sync)"
ssh "root@$ip" "nohup sh -c $commands"
在这种情况下,由于某种原因sh -s
根本不起作用。
答案1
nohup 的技巧有时是重定向所有三个标准流。这应该适合你:
cat ./do_sync | ssh root@ip "cat > /tmp/do_sync && chmod 777 /tmp/do_sync ; nohup /tmp/do_sync 2>/dev/null >/dev/null </dev/null &"
但如果没有 的重定向nohup
,它将阻塞。
答案2
另一种方法是
cat do_sync | ssh "root@ip" 'nohup sh -s'
我假设您看到的效果是因为您./do_sync
在后台执行。只是看起来该进程仍然挂起。除非你真的看到一个开放的连接?