可以在脚本中通过 SSH 使用“屏幕”吗?

可以在脚本中通过 SSH 使用“屏幕”吗?

我遇到了一个有趣的问题,我想启动这个命令

nc -l 8023 | zfs receive tank3/pro1

在远程主机上10.10.10.11

如果我跑

ssh -n 10.10.10.11 'nohup nc -l 8023 | zfs receive tank3/pro1 &'

从脚本内部,它就不会在脚本中继续,因为zfs它正在等待 STDIN。

如果我重定向 STDIN、STDOUT、STDERR

ssh -n 10.10.10.11 'nohup nc -l 8023 | zfs receive tank3/pro1 &> /dev/null < /dev/null &'

然后脚本继续,但是重定向 STDIN 会破坏该zfs命令。

问题

screen用来解决这个问题吗?

或者有其他想法?

答案1

您可以尝试以下示例:

ssh -t root@server1 screen "tail -f /var/log/messages"

-t 强制分配伪终端。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用

答案2

我没有 ZFS,但我写了一个简单的脚本来模拟读取 stdin。对我来说似乎有用

〜/ sand / readme.sh:

#!/bin/sh
while read X
do
   echo $X
done

进而:

ssh localhost "nc -l 8023 | ~/sand/readme.sh &\\disown"

或者使用单引号:

ssh localhost 'nc -l 8023 | ~/sand/readme.sh &\disown'

\分隔多个远程 ssh 命令,或者至少对我来说似乎是这样的 :)。disown将允许您从后台作业中中断。每当我运行一个长命令并且直到我应该在屏幕上执行它之后才意识到时,我都会使用这个。CTRL+Z; bg; disown如果您遇到这种情况。您可以注销 SSH,它将继续在后台运行。

答案3

您确实可以使用屏幕来实现这一点,并以-d -m分离模式启动:

ssh 10.10.10.11 screen -d -m 'nc -l 8023 | zfs receive tank3/pro1'

相关内容