我有一个服务器列表,我想将其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"
答案 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
)
<( .. )
部分。对于文件中的每一行,都会运行sed。 sed将行添加到文件末尾并输出。这样就得到了所有可能的服务器对。|
重定向。
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