
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:
- Pingt alle Rechner an (durch Analyse einer Datei mit allen unseren Rechnernamen)
- Wenn der Ping erfolgreich ist, testen Sie die SSH-Verbindung ohne Passwort (mit dem Befehl
ssh -o BatchMode=yes $machine uname -a
) - 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“ - 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 continue
funktioniert nicht. Ich habe continue
// ausprobiert continue 2
, continue 3
aber es will immer noch nicht in die vorherige Schleife zurückkehren.
Antwort1
Wie in einem Kommentar vorgeschlagen, habe ich das weggelassen continue
und statt „mehrere“ einfach einige weitere Anweisungen elif
verwendet :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!