
.csvファイルを含むcsvファイルを読み取るスクリプトがありますSourceIp, DestinationIP,Source Ports, Destination Ports
。
まず、sourceIpを読み、ここでsshを試しています(成功的に実行できます)。ここでは、疑似端末を取得してsourcePort(ハイフン)を繰り返すforループを実行しようとしています。別途)と宛先ポート。
入力ファイルの内容:
10.X.X.9,10.X.X.23,8140-61613,1521-1524-1525-1526-1530-1531-8140-61613
スクリプト:
export lastSourceIP=""
export lastDestinationIP=""
export fqdn=""
export sourceFqdn=""
x=0
export username="sjain";
export location="/home/sjain/poc";
export baseLocation="10.X.X.9"
while IFS="," read f1 f2 f3 f4
do
x=$(($x+1))
TMP=$(mktemp)
TMP2=$(mktemp)
echo "Source IP : $f1"
echo "Destination IP : $f2"
echo "Source Ports : $f3"
echo "Destination Ports : $f4"
export sourceIP=$f1
export destIP=$(echo "$f2" | tr -d '\n')
export port=$(echo "$f3" | tr -d '\n')
export destinationPorts=$(echo "$f4" | tr -d '\n')
ssh -t -t $username@$sourceIP 'bash -s' <<ENDSSH
(IFS='-'; for sourceP in $port; do
(for destinationP in $destinationPorts; do
echo "$sourceP" - "$destinationP"
done;)
done;)
exit
ENDSSH
done < ipaddress.csv
ただし、このスクリプトを実行すると、sourceIP - DestinationIp値は印刷されません。これがコンソールから得られる出力です。
出力:
Source IP : 10.X.X.9
Destination IP : 10.X.X.23
Source Ports : 8140-61613
Destination Ports : 1521-1524-1525-1526-1530-1531-8140-61613
tcgetattr: Inappropriate ioctl for device
(IFS='-'; for sourceP in 8140-61613; do
(for destinationP in 1521-1524-1525-1526-1530-1531-8140-61613; do
echo "" - ""
done;)
done;)
exit
[[email protected] ~]$ (IFS='-'; for sourceP in 8140-61613; do
> (for destinationP in 1521-1524-1525-1526-1530-1531-8140-61613; do
> echo "" - ""
> done;)
> done;)
-
[[email protected] ~]$ exit
exit
Connection to 10.X.X.9 closed
.
予想出力:
8140-1521
8140-1524
.... and so on
私が間違っていることを助けてください。
答え1
リモートホストでループ変数が逆参照されていることを確認する必要があります。
ssh -t -t $username@$sourceIP 'bash -s' <<ENDSSH
IFS='-'
for sourceP in $port; do
for destinationP in $destinationPorts; do
echo "\$sourceP" - "\$destinationP"
done
done
ENDSSH
すべての括弧を使用すると、各ループ反復に対してサブシェルが開始されます。
すべての変数をエクスポートする必要はなく、子プロセス環境に必要な変数のみをエクスポートできます。
これは、「内部」改行文字がないと仮定するものとdestIP=$(echo "$f2" | tr -d '\n')
変わりません。末尾の改行を削除します。destIP=$f2
$(command substitution)