Linux

繼續聲明不能正常工作 - bash

  • March 31, 2022

對於上下文,我有一個使用 ssh 的多台機器的基礎設施。我們通過 ssh 在沒有密碼的機器上以 root 身份連接,感謝每台機器上的 authorized_keys 文件。我們定期在我們的基礎設施中添加新機器。

有問題的是創建一個腳本:

  1. ping 所有機器(通過解析包含我們所有機器名稱的文件)
  2. 如果 ping 成功,請在沒有密碼的情況下測試 ssh 連接(使用命令ssh -o BatchMode=yes $machine uname -a
  3. 如果 ssh 不起作用並且是因為此消息:(Are you sure you want to continue connecting (yes/no)?例如,因為它是與這台機器的第一個 ssh 連接),那麼使用期望腳本,發送“yes”
  4. 如果 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 2continue 3

正如評論中所建議的,我確實放棄了continueand 而不是多個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

非常感謝您的所有回答!

引用自:https://serverfault.com/questions/1097377