Shell-Script
在 shell 腳本上使用變數循環 for
我有以下腳本,它使用密鑰通過 SSH 連接到伺服器,並在那裡製作了很多東西。
#!/usr/bin/env bash ssh -i mykey.pem myuser@SERVER_IP << 'ENDSSH' [A LOT OF STUFF] ENDSSH
(我用它執行它
sh scriptname.sh
)現在我想在另一台伺服器上進行相同的操作,所以我必須使用兩個不同的文件(和)通過 SSH 連接到兩個不同的伺服器(和
ip_1
)。ip_2``.pem``mykey1.pem``mykey2.pem
到目前為止,我知道如何循環 ips,如下所示:
#!/usr/bin/env bash ip_list="ip_1 ip_2" for ip in $ip_list; do ssh -i mykey.pem myuser@$ip << 'ENDSSH' [A LOT OF STUFF] ENDSSH done
但現在我也想循環以獲取正確的 pem 文件。我怎樣才能歸檔這個?也許還有另一個清單?有人可以為我提供一個優雅的解決方案嗎?
ip_1
應該使用mykey1.pem
ip_2
應該使用mykey2.pem
提前致謝
由於您使用的是 bash,因此您可以使用關聯數組:
#!/usr/bin/env bash declare -A ip_list=(["ip_1"]="mykey1.pem" ["ip_2"]="mykey2.pem") for ip in "${!ip_list[@]}"; do ssh -i "${ip_list[$ip]}" myuser@"$ip" << 'ENDSSH' [A LOT OF STUFF] ENDSSH done
請注意,關聯數組與正常索引數組不同,它不會按特定順序保存,因此無法保證
ip_1
會在ip_2
.如果您需要使用簡單的 POSIX 兼容 shell,請使用 ip 和密鑰文件創建一個文件,每行一個:
$ cat iplist.txt ip1 mykey1.pem ip2 mykey2.pem
然後,使用這個腳本:
#!/bin/sh while read -r ip key; do ssh -i "$key" myuser@"$ip" << 'ENDSSH' [A LOT OF STUFF] ENDSSH done
並執行它:
sh /path/to/script < /path/to/iplist.txt
但如果你走那條路,Stéphane 的方法會更好。