如何使用ssh命令连接多台计算机并同时向每台计算机发送不同的命令

如何使用ssh命令连接多台计算机并同时向每台计算机发送不同的命令

我需要连接多台计算机来运行不同的程序。对于不同的计算机,我需要向它们发送不同的命令。如何使用ssh命令连接多台计算机并向每台计算机发送不同的命令?我为每台计算机运行程序的命令是 nohup Rscript program_i.R > program_i_out.txt。说得详细一点。我想用3台电脑来运行3个程序。然后我会发送

nohup Rscript program_1.R > program_1_out.txt到第一台计算机,

nohup Rscript program_2.R > program_2_out.txt到第二台计算机,

nohup Rscript program_3.R > program_3_out.txt到第三台计算机。

答案1

尝试ssh -f user@host '<your command here>'

从 ssh 手册页:

-f Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background.

例如,如果我这样做ssh -f <my computer> 'echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!",它会打印hello 1 person in ssh!

打印 2 后,会话自动退出,但您不必等待它退出。如果我ssh -f <my computer> 'sleep 30 && echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!"'这样做,看起来好像什么也没发生,我可以像平常一样做任何事情,但 30 秒后,它会打印hello 1 person in ssh!

使用>重定向会将所有标准输出重定向到文件,但所有错误仍会打印到屏幕上。为了避免这种情况,您可以使用&>将所有输出(stdout 和 stderr)重定向到文件。

答案2

可以通过多种方式调用 SSH。人们调用它的最常见方式是使用:

ssh user@host

这将打开一个交互式终端。然而,幕后的 SSH 实际上有一个更像这样的调用方式:

ssh user@host /usr/bin/foo

所以第一种类型基本上只是为你连接并运行 bash,这很方便。它基本上是为你做这件事:

ssh user@host sh

sh该系统的外壳在哪里,可能是bash.

为了便于论证,我们假设您需要运行的命令是mycommand

(我简化这一点的原因是因为您作为示例给出的命令包含nohup输出重定向,这意味着您需要正确转义该命令。此外,如果您正在努力nohup使该命令在 SSH 连接后保持活动状态终止,您可能希望使用setsid它来使其成为会话领导者,无论哪种情况,您都将使用&)将其设为异步命令。

对于不同的计算机,我需要向它们发送不同的命令。

您没有指定要如何执行此操作。例如,机器是发起SSH 连接决定运行哪个命令,还是由远程计算机上的配置指定?

如果启动与各种远程计算机的连接的计算机应该决定写入哪个命令,则需要将该信息存储在某处并使用它。

实现此目的的一种方法是将数据通过管道传输到 SSH,因为默认情况下它将调用bash,它将从标准输入中读取:

cat command.txt | ssh user@host

我在这里使用了cat comand.txt一个示例来生成应发送到 SSH 的命令,因为我不知道您现在如何保存该信息。将所有信息存储在文本文件中可能是最简单的方法,如下所示:

user  host  command
user2 host2 command2
user3 host3 command3

您现在可以创建一个管道来执行此操作,尽管它会有点复杂(您必须使用像sed或 之类的解析器awk)。使用 Perl 或 PHP 等轻型脚本语言可能更容易:

<?php

foreach (file('myfile.txt') as $line) {
    list($user, $host, $command) = explode(' ', $line);
    passthru("ssh $user@$host $command");
}

相关内容