ssh到服务器列表并针对同一列表运行命令

时间:2019-01-17 00:20:47

标签: bash

我有一个服务器列表,我想将其SSH到列表中的每个服务器,然后针对同一服务器列表运行命令,然后再移至下一个服务器并再次通过列表运行命令。

#!/bin/bash

while read -u 9 server; do
    ssh root@$server iperf -c $server -y C >> "/tmp/results.txt"
    done 9< /root/servers.txt

我希望显示结果

server1 -> server1
server1 -> server2
server1 -> server3
server2 -> server1
server2 -> server2
server2 -> server3

但结果显示

server1 -> server1
server1 -> server2
server1 -> server3

编辑

这就是我最终得到的:

#!/bin/bash

SERVERS=`cat /root/servers.txt`
DATE=$(date +%Y%m%d_%H%M%S)

for server in $SERVERS; do
    echo "Starting iperf server on $server"
    ssh root@$server nohup iperf -s < /dev/null >> /tmp/log_$DATE.txt 2>&1 &
    sleep 5
    for client in $SERVERS; do
            echo Testing from $client to $server
            ssh root@$client iperf -c $server -y C >> /tmp/results_$DATE.txt
    done
    ssh root@$server pkill -KILL iperf >> /tmp/log_$DATE.txt
done

echo "Test results saved to /tmp/results_$DATE.txt" 

1 个答案:

答案 0 :(得分:2)

您希望服务器列表的所有可能的2个长度排列。然后,您要为每对服务器运行测试。没有比这更简单的了。

while read -r srv1 srv2; do
    ssh root@"$srv1" iperf -c "$srv2" -y C >> "/tmp/results.txt"
done < <(
    while read -r line; do
        sed 's/$/ '"$line"'/' /root/servers.txt
    done < /root/servers.txt
)
  1. 首先是<( .. )部分。对于文件中的每一行,都会运行sed。 sed将行添加到文件末尾并输出。这样就得到了所有可能的服务器对。
  2. 对于每对,调整perf命令。
  3. 我们还可以进行|重定向。

while read -r line; do
     sed 's/$/ '"$line"'/' /root/servers.txt
done < /root/servers.txt |
while read -r srv1 srv2; do
    ssh root@"$srv1" iperf -c "$srv2" -y C >> "/tmp/results.txt"
done