后台同步ssh

发布于 2025-01-07 06:34:41 字数 595 浏览 1 评论 0原文

这是以下问题的后续: 在 bash shell 脚本中执行 ssh 命令 问题

我正在做类似的工作:

while read line
do
   ssh -n root@$line 'command'
   do something
done

是我只想在上一个 ssh 行中的“命令”执行完成时才执行“做某事”部分,即我想等待后台 ssh 完成。 我可以使用睡眠,但这不适合我的应用程序。请指导我。

我不想特别在后台运行 ssh 。我这样做只是为了让我的循环正常运行。如 在 bash shell 中执行 ssh 命令中给出的循环内的脚本 如果我们不给出 -n 标志,循环将在第一个 ssh 命令执行后终止。

This is a follow-up to the following question:
Executing ssh command in a bash shell script within a loop

I am doing a similar job:

while read line
do
   ssh -n root@$line 'command'
   do something
done

The problem is that I want to execute the "do something" part only when the execution of 'command' is complete in the previous ssh line ie I want to wait till the background ssh completes.
I can use sleep, but this does not suit my application. Please guide me.

I don't want to particularly run ssh in the background. I am only doing this so that my loop runs properly. As given in Executing ssh command in a bash shell script within a loop
if we dont give -n flag, the loop terminates after first ssh command execution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独闯女儿国 2025-01-14 06:34:41

如果您的命令不在后台运行,则执行 ssh 服务器命令将等待该命令完成。例如,试试这个:

ssh server "sleep 3"
echo finished

这将在远程服务器上实际执行 sleep 3 后(即 3 秒后)打印“finished”。

试试这个 - 在 ~/tmp 中创建三个文件 - 称为lines、parent.sh和child.sh。为了进行测试,请在运行 sshd 的计算机上创建它们,这样您就可以使用 ssh localhost 代替 ssh 服务器。将其放入其中:

  • <前><代码>第1行
    第2行
    3号线

  • parent.sh

    读取 l 时;做
      回显下一行
      ssh -n localhost“~/tmp/child.sh $l”
    完成<线
    回显父级
    
  • 子.sh

    回显子处理:$1
    睡觉2
    回声孩子完成
    

当您运行parent: 时,

$ cd ~/tmp
$ ./parent.sh

输出将是这样的:

next line
child processing: line1
child done
next line
child processing: line2
child done
next line
child processing: line3
child done
parent

这表明child 将在parent 继续处理下一行之前执行。您将在“childprocessing”和“childdone”行之间看到 2 秒睡眠(在 child.sh 中执行 sleep 2 的结果)。

请注意,ssh -n 不适用于在后台运行 ssh - 它用于不消耗标准输入。要在后台运行 ssh,可以使用 ssh -f - 请参阅 man ssh。

If your command is not run in the background, executing ssh server command will wait for that command to finish. For example, try this:

ssh server "sleep 3"
echo finished

This will print "finished" after sleep 3 actually executed on the remote server (i.e. after 3 seconds).

Try this - make three files in ~/tmp - called lines, parent.sh and child.sh. For a test, make them on some machine that has sshd running, so you can use ssh localhost instead of ssh server. Put this in them:

  • lines

    line1
    line2
    line3
    
  • parent.sh

    while read l; do
      echo next line
      ssh -n localhost "~/tmp/child.sh $l"
    done < lines
    echo parent
    
  • child.sh

    echo child processing: $1
    sleep 2
    echo child done
    

When you run parent:

$ cd ~/tmp
$ ./parent.sh

the output will be this:

next line
child processing: line1
child done
next line
child processing: line2
child done
next line
child processing: line3
child done
parent

which shows that child will execute before the parent will continue processing a next line. You will see a 2 second sleep (a result of sleep 2 executing in the child.sh) between "child processing" and "child done" lines.

Note that ssh -n is not for running ssh in the background - it's for not consuming stdin. To run ssh in background, ssh -f can be used - see man ssh.

谁对谁错谁最难过 2025-01-14 06:34:41

一点谷歌搜索帮助我:

while read line
do
   ssh root@$line 'command' < /dev/null
   do something
done

这样,就不需要 -n 标志。
欲了解更多详情:
http://72.14.189.113/howto/shell/while-ssh/

A little bit of googling help me:

while read line
do
   ssh root@$line 'command' < /dev/null
   do something
done

In this way, there is no need of -n flag.
For more details:
http://72.14.189.113/howto/shell/while-ssh/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文