Continue-Anweisung funktioniert nicht wie sie sollte - bash

Continue-Anweisung funktioniert nicht wie sie sollte - bash

Für den Kontext: Ich habe eine Infrastruktur mit mehreren Maschinen, die SSH verwenden. Wir verbinden uns per SSH als Root ohne Passwort mit den Maschinen, dank der Datei authorized_keys auf jeder Maschine. Wir fügen unserer Infrastruktur regelmäßig neue Maschinen hinzu.

Das Problem besteht darin, ein Skript zu erstellen, das:

  1. Pingt alle Rechner an (durch Analyse einer Datei mit allen unseren Rechnernamen)
  2. Wenn der Ping erfolgreich ist, testen Sie die SSH-Verbindung ohne Passwort (mit dem Befehl ssh -o BatchMode=yes $machine uname -a)
  3. Wenn SSH nicht funktioniert UND dies an dieser Meldung liegt: Are you sure you want to continue connecting (yes/no)?(weil es sich beispielsweise um die erste SSH-Verbindung zu diesem Computer handelt), senden Sie mit einem Expect-Skript „yes“
  4. Wenn SSH nicht funktioniert UND dies daran liegt, dass nach einem Passwort gefragt wird, senden Sie mit einem Expect-Skript „STRG + C“.

Mein Problem besteht darin, dass die beiden Bedingungen 3. und 4. beide auf einer Maschine eintreten können und ich nicht herausfinden kann, wie ich die Continue-Anweisung in meinem Skript verwende.

Dieser spezielle Fall wäre bei einer Maschine der Fall, die nach einem „Ja“ fragt, danach aber auch nach einem Passwort fragt.

So sieht das Skript aus:

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

Hier ist das Expect-Skript (es behandelt beide Situationen):

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}
}

Kurz gesagt, mein Problem ist, dass ich die Maschine, die nach einer „Ja“-Antwort fragt und dann ein Passwort benötigt, in der ${sshnok}Datei registrieren möchte, aber das continuefunktioniert nicht. Ich habe continue// ausprobiert continue 2, continue 3aber es will immer noch nicht in die vorherige Schleife zurückkehren.

Antwort1

Wie in einem Kommentar vorgeschlagen, habe ich das weggelassen continueund statt „mehrere“ einfach einige weitere Anweisungen elifverwendet :if

für Maschine incat ${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

Vielen Dank für alle Antworten!

verwandte Informationen