在名称来自另一个命令的两台主机上运行 SSH 命令

在名称来自另一个命令的两台主机上运行 SSH 命令

所以我想做的事情应该相当简单,但我似乎无法弄清楚。我需要杀死不同机器上的某个进程,它们都有一个定义的 IP 范围,尽管它们最终会改变。

比方说,

arp |sort |awk '{print $1}'|grep 10.20.30.18 # IP's range from 180 to 189 so this does the trick

输出是

xxx.xxx.xxx.180
xxx.xxx.xxx.181

所以我想通过 SSH 连接到两者并执行以下操作

ps -ef | grep X11 | grep -v grep | awk '{print $2}' | xargs kill

我该如何继续解决这个问题,而不必通过 SSH 连接到每个进程,然后终止该进程?

答案1

您可以使用for循环:

HOSTS='server1.example.com server2.example.com server3.example.com'

for server in $HOSTS
do
   ssh $server "ps -ef | grep X11 | grep -v grep | awk '{print \$2}' | xargs kill"
done

或者您可以使用为此目的制作的众多应用程序之一。诸如此类clusterssh

答案2

您确定要终止进程的所有主机都在您的 arp 缓存中吗?

假设 IP 是连续的,您最好简单地迭代 ip:

for i in {180..189}
do
 ssh -l username 10.20.30.$[i} "ps -ef | grep X11 | grep -v grep | awk '{print $2}' | xargs kill"
done

相关内容