Linux
繼續聲明不能正常工作 - bash
對於上下文,我有一個使用 ssh 的多台機器的基礎設施。我們通過 ssh 在沒有密碼的機器上以 root 身份連接,感謝每台機器上的 authorized_keys 文件。我們定期在我們的基礎設施中添加新機器。
有問題的是創建一個腳本:
- ping 所有機器(通過解析包含我們所有機器名稱的文件)
- 如果 ping 成功,請在沒有密碼的情況下測試 ssh 連接(使用命令
ssh -o BatchMode=yes $machine uname -a
)- 如果 ssh 不起作用並且是因為此消息:(
Are you sure you want to continue connecting (yes/no)?
例如,因為它是與這台機器的第一個 ssh 連接),那麼使用期望腳本,發送“yes”- 如果 ssh 不起作用並且是因為要求輸入密碼,那麼使用期望腳本,發送“CTRL + C”
我的問題是這兩個條件 3. 和 4. 都可能發生在一台機器上,我不知道如何在我的腳本中使用 continue 語句。
這種特定情況適用於要求“是”但之後也要求輸入密碼的機器。
這是腳本的樣子:
for machine in `cat ${liste} | grep -v \#` do ping -c1 ${machine} 2>&1 >/dev/null if [ $? -eq 0 ] then echo ${machine} >> ${pingok} ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1 echo $? > ${exitcode} if grep -q "255" "$exitcode" then cut -c 15-74 $verifssh > $verifssh2 if grep "ication failed." "$verifssh2" then expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null continue 3 elif grep "Permission denied (publickey,password,keyboard-interactive)." "$verifssh2" then expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null echo "${machine} -> The machine asks for a password" >> "${sshnok}" fi elif grep -q "0" "$exitcode" then echo "${machine} works with ssh" echo "${machine}" >> ${sshok} fi else echo "${machine}" >> "${pingnok}" fi done
這是期望腳本(它處理這兩種情況):
set machine [lindex $argv 0] spawn ssh $machine expect { "Are you sure you want to continue connecting (yes/no)? " {send "yes\r";exp_continue} -exact "Password: " {close} -re $prompt {send "exit\r";close} }
所以簡而言之,我的問題是,對於要求“是”答案然後需要密碼的機器,我想在
${sshnok}
文件中註冊它們但continue
不起作用。我試過continue
//它仍然不想回到上一個循環continue 2
。continue 3
正如評論中所建議的,我確實放棄了
continue
and 而不是多個elif
我只是做了更多的if
陳述:機器進
cat ${liste} | grep -v \#
do echo "." ping -c1 ${machine} 2>&1 >/dev/null if [ $? -eq 0 ] then echo ${machine} >> ${pingok} ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1 echo $? > ${exitcode} if grep -q "255" "$exitcode" then cut -c 15-74 $verifssh > $verifssh2 if grep "ication failed." "$verifssh2" then expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null fi ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1 cut -c 15-74 $verifssh > $verifssh2 if grep "Permission denied (publickey,password,keyboard-interactive)." "$verifssh2" then expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null echo "${machine} -> Probleme de cle ssh (demande un mdp)" >> "${sshnok}" fi ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1 echo $? > ${exitcode} if grep -q "0" "$exitcode" then echo "${machine}" >> ${sshok} fi elif grep -q "0" "$exitcode" then echo "${machine}" >> ${sshok} elif grep -q "1" "$exitcode" then echo "wtf 1" fi else echo "${machine}" >> "${pingnok}" fi done
非常感謝您的所有回答!