Für den Kontext habe ich eine Infrastruktur mit mehreren Maschinen, die ssh verwenden. Wir verbinden uns über ssh als root auf den Maschinen ohne Passwort, 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 die gesamte Maschine an (indem eine Datei analysiert wird, die alle unsere Maschinennamen enthält)
  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 es an dieser Nachricht liegt: Are you sure you want to continue connecting (yes/no)?(weil es zum Beispiel die erste ssh-Verbindung zu diesem Computer ist), dann senden Sie mit einem erwarteten Skript "yes".
  4. Wenn ssh nicht funktioniert UND es daran liegt, dass nach einem Passwort gefragt wird, senden Sie mit einem erwarteten Skript "STRG + C".

Mein Problem ist, dass die beiden Bedingungen 3. und 4. beide auf einem Computer auftreten können und ich nicht herausfinden kann, wie ich die Continue-Anweisung in meinem Skript verwenden soll.

Dieser spezielle Fall wäre für eine Maschine, 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 erwartete 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, für die Maschine, die nach einer "Ja" -Antwort fragt und dann ein Passwort benötigt, möchte ich sie in der ${sshnok}Datei registrieren, aber das continuefunktioniert nicht. Ich habe versucht, continue/ continue 2/ continue 3​​und es will immer noch nicht in die vorherige Schleife zurückkehren.

answer

Wie in einem Kommentar vorgeschlagen, habe ich das weggelassen continueund statt mehrerer elifnur einige weitere ifAussagen gemacht:

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