nmap_vm(){
while (( SECONDS < 120 )); do
sshportactive=$(nmap $kernel_ipv4 -PN -p ssh | egrep 'open|closed|filtered' | awk '{print $2}')
if [[ $sshportactive == open ]]; then
$(setup_vm)
break
fi
$(failed_VM)
done
}
複数の仮想マシンを起動し、SSHポートが開いていることを確認しようとしています。引き続き確認する方法sshportactive==開く120秒まで。
120秒前に値に達すると中断され、実行されます。$(setup_vm)&値が== 120秒まで開かない場合は、ループを中断して実行します。$(失敗した仮想マシン)
編集1
おっしゃったように試してみましたが、120秒間待ちません。 (以下にサンプルコードを公開しました。本番の他の機能からIPを取得します。)
funA(){
#Now we nmap to check if the SSH is Working or Not
t_start=$SECONDS
while (( (SECONDS - t_start) < 10 )); do
if nmap $1 -PN -p ssh -oG - | grep -q '22/open/tcp'; then
echo " This VM is Working Properly $2"
return 0
fi
sleep 1
done
# we only get here if the loop exits without the port being open
echo "This VM is not working $2"
return 1
}
funB(){
funA 172.105.252.241 lol
funA 192.46.213.31 lol
}
私たちが得た結果は次のとおりです。
bash -x g.sh
+ funB
+ funA 172.105.252.241 lol
+ t_start=0
+ (( (SECONDS - t_start) < 10 ))
+ nmap 172.105.252.241 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ echo ' This VM is Working Properly lol'
This VM is Working Properly lol
+ return 0
+ funA 192.46.213.31 lol
+ t_start=0
+ (( (SECONDS - t_start) < 10 ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ (( (SECONDS - t_start) < 10 ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ (( (SECONDS - t_start) < 10 ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ (( (SECONDS - t_start) < 10 ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ (( (SECONDS - t_start) < 10 ))
+ echo 'This VM is not working lol'
This VM is not working lol
+ return 1
編集2
本番で使用するスクリプトから直接公開します。
ipv4_11011_22022="192.46.209.19"
ipv4_33033_44044_10101="45.79.121.184"
ipv4_55055_10001_20002="172.105.47.73"
ipv4_20202_30303_40404_50505_30033="172.105.58.123"
ipv4_30003_40004_50005="172.105.34.152"
ipv4_10011_20022_40044="45.79.124.118"
ipv4_50055_11111="172.105.48.47"
ipv4_22222_33333="172.105.51.44"
ipv4_44444_55555="172.105.253.130"
ipv4_KERNEL="172.105.42.211"
VM1_LABEL="11011_22022"
VM2_LABEL="33033_44044_10101"
VM3_LABEL="55055_10001_20002"
VM4_LABEL="20202_30303_40404_50505_30033"
VM5_LABEL="30003_40004_50005"
VM6_LABEL="10011_20022_40044"
VM7_LABEL="50055_11111"
VM8_LABEL="22222_33333"
VM9_LABEL="44444_55555"
VMK_LABEL="KERNEL"
healthcheck(){
nmap $ipv4_11011_22022 $VM1_LABEL
nmap $ipv4_33033_44044_10101 $VM2_LABEL
nmap $ipv4_55055_10001_20002 $VM3_LABEL
nmap $ipv4_20202_30303_40404_50505_30033 $VM4_LABEL
nmap $ipv4_30003_40004_50005 $VM5_LABEL
nmap $ipv4_10011_20022_40044 $VM6_LABEL
nmap $ipv4_50055_11111 $VM7_LABEL
nmap $ipv4_22222_33333 $VM8_LABEL
nmap $ipv4_44444_55555 $VM9_LABEL
nmap $ipv4_KERNEL $VMK_LABEL
}
nmap(){
#Now we nmap to check if the SSH is Working or Not
t_start=$SECONDS
while (( (SECONDS - t_start) < 120 )); do
if nmap $1 -PN -p ssh -oG - | grep -q '22/open/tcp'; then
echo " This VM is Working Properly $2"
return 0
fi
sleep 5
done
# we only get here if the loop exits without the port being open
healthcheck_failed $2
return 1
}
healthcheck_failed(){
echo "Healthcheck of VM $1 FAILED"
}
healthcheck
私たちが得た結果は次のとおりです。 出力はここに公開されます。
何が間違っているのかIDK、スクリプトは移動されず、最初のIPに接続されています。
答え1
各ループ反復中の値を確認する代わりに、ループがSECONDS
開始される前の値を記録し、各ループ反復の経過時間を計算して確認します。SECONDS
たとえば、
#!/bin/bash
nmap_vm() {
t_start=$SECONDS
while (( (SECONDS - t_start) < 10 )); do
if some_command; then
echo "some_command succeeded"
return 0
fi
sleep 1
done
# we only get here if the loop exits because the time expired
echo "some_command failed"
return 1
}
nmap_vm
failed_vm
120秒後に接続できない場合にのみ呼び出して、次の結果が出るようにコードを更新してください。
#!/bin/bash
setup_vm() {
echo setup vm
}
failed_vm() {
echo failed vm
}
nmap_vm() {
t_start=$SECONDS
while (( (SECONDS - t_start) < 10 )); do
# rather than nmap | egrep | awk, we can use nmap's "greppable" output and just look
# for a specific fixed pattern
if nmap $kernel_ipv4 -PN -p ssh -oG - | grep -q '22/open/tcp'; then
setup_vm
return 0
fi
# you don't necessarily need this delay in the loop but I like
# to ensure a reasonable rate limit.
sleep 1
done
# we only get here if the loop exits without the port being open
failed_vm
return 1
}