Shell-Script

在 shell 腳本上使用變數循環 for

  • March 26, 2019

我有以下腳本,它使用密鑰通過 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 的方法會更好。

引用自:https://unix.stackexchange.com/questions/508706