如何向 Linux 中的 运行 程序向多个主机发送不同的命令
how to send different commands to multiple hosts to run programs in Linux
我是 R 用户。我总是 运行 在校园的多台计算机上编程。例如,我需要 运行 10 个不同的程序。我需要打开 PuTTY 10 次才能登录到 10 台不同的计算机。并将每个程序提交给 10 台计算机中的每台计算机(它们的 OS 是 Linux)。有没有办法同时登录 10 台不同的计算机并向它们发送命令?我使用以下命令提交程序
nohup Rscript L_1_cc.R > L_1_sh.txt
nohup Rscript L_2_cc.R > L_2_sh.txt
nohup Rscript L_3_cc.R > L_3_sh.txt
首先设置 ssh,以便您无需输入密码即可登录(google,如果您不知道如何登录)。然后写一个脚本ssh到每个远程主机到运行命令。下面是一个例子。
#!/bin/bash
host_list="host1 host2 host3 host4 host5 host6 host7 host8 host9 host10"
for h in $host_list
do
case $h in
host1)
ssh $h nohup Rscript L_1_cc.R > L_1_sh.txt
;;
host2)
ssh $h nohup Rscript L_2_cc.R > L_2_sh.txt
;;
esac
done
这是一个非常简单的例子。您可以做得更好(例如,您可以将“.R”和“.txt”文件名放入变量中并使用它,而不是明确列出案例中的每个选项)。
根据您的主题标签,我假设您正在使用 ssh 登录远程机器。希望您使用的机器是基于 *nix 的,这样您就可以使用以下脚本。如果您在 Windows 上,请考虑使用 cygwin。
首先,阅读本文以在每个远程目标上设置 public 密钥身份验证:http://www.cyberciti.biz/tips/ssh-public-key-based-authentication-how-to.html
这将防止 ssh 在您每次登录每个目标时提示您输入密码。然后,您可以使用类似以下内容的脚本在每个目标上执行命令:
#!/bin/bash
#kill script if we throw an error code during execution
set -e
#define hosts
hosts=( 127.0.0.1 127.0.0.1 127.0.0.1)
#define associated user names for each host
users=( joe bob steve )
#counter to track iteration for correct user name
j=0
#iterate through each host and ssh into each with user@host combo
for i in ${hosts[*]}
do
#modify ssh command string as necessary to get your script to execute properly
#you could even add commands to transfer the file into which you seem to be dumping your results
ssh ${users[$j]}@$i 'nohup Rscript L_1_cc.R > L_1_sh.txt'
let "j=j+1"
done
#exit no error
exit 0
如果您设置了 public 密钥身份验证,您应该只需要执行您的脚本让每个远程主机做他们的事情。您甚至可以考虑从文件中加载 users/hosts 数据,以避免将该信息硬编码到数组中。
我是 R 用户。我总是 运行 在校园的多台计算机上编程。例如,我需要 运行 10 个不同的程序。我需要打开 PuTTY 10 次才能登录到 10 台不同的计算机。并将每个程序提交给 10 台计算机中的每台计算机(它们的 OS 是 Linux)。有没有办法同时登录 10 台不同的计算机并向它们发送命令?我使用以下命令提交程序
nohup Rscript L_1_cc.R > L_1_sh.txt
nohup Rscript L_2_cc.R > L_2_sh.txt
nohup Rscript L_3_cc.R > L_3_sh.txt
首先设置 ssh,以便您无需输入密码即可登录(google,如果您不知道如何登录)。然后写一个脚本ssh到每个远程主机到运行命令。下面是一个例子。
#!/bin/bash
host_list="host1 host2 host3 host4 host5 host6 host7 host8 host9 host10"
for h in $host_list
do
case $h in
host1)
ssh $h nohup Rscript L_1_cc.R > L_1_sh.txt
;;
host2)
ssh $h nohup Rscript L_2_cc.R > L_2_sh.txt
;;
esac
done
这是一个非常简单的例子。您可以做得更好(例如,您可以将“.R”和“.txt”文件名放入变量中并使用它,而不是明确列出案例中的每个选项)。
根据您的主题标签,我假设您正在使用 ssh 登录远程机器。希望您使用的机器是基于 *nix 的,这样您就可以使用以下脚本。如果您在 Windows 上,请考虑使用 cygwin。
首先,阅读本文以在每个远程目标上设置 public 密钥身份验证:http://www.cyberciti.biz/tips/ssh-public-key-based-authentication-how-to.html
这将防止 ssh 在您每次登录每个目标时提示您输入密码。然后,您可以使用类似以下内容的脚本在每个目标上执行命令:
#!/bin/bash
#kill script if we throw an error code during execution
set -e
#define hosts
hosts=( 127.0.0.1 127.0.0.1 127.0.0.1)
#define associated user names for each host
users=( joe bob steve )
#counter to track iteration for correct user name
j=0
#iterate through each host and ssh into each with user@host combo
for i in ${hosts[*]}
do
#modify ssh command string as necessary to get your script to execute properly
#you could even add commands to transfer the file into which you seem to be dumping your results
ssh ${users[$j]}@$i 'nohup Rscript L_1_cc.R > L_1_sh.txt'
let "j=j+1"
done
#exit no error
exit 0
如果您设置了 public 密钥身份验证,您应该只需要执行您的脚本让每个远程主机做他们的事情。您甚至可以考虑从文件中加载 users/hosts 数据,以避免将该信息硬编码到数组中。