Pentru context, am o infrastructură de mai multe mașini care folosesc ssh.
Ne conectăm prin ssh ca root pe mașini fără parolă, mulțumim fișierului authorized_keys de pe fiecare mașină. Adăugăm în mod regulat noi mașini în infrastructura noastră.
Problema este de a crea un script care:
- Face ping la toată mașina (prin analizarea unui fișier care conține toate numele mașinii noastre)
- Dacă ping-ul are succes, testați conexiunea ssh fără parolă (cu comanda
ssh -o BatchMode=da $mașină uname -a
)
- Dacă ssh-ul nu funcționează ȘI este din cauza acestui mesaj:
Sigur doriți să continuați conectarea (da/nu)?
(pentru că este prima conexiune ssh la această mașină, de exemplu), apoi cu un script expect, trimiteți „da”
- Dacă ssh nu funcționează ȘI pentru că este cerută o parolă, atunci cu un script expect, trimiteți „CTRL + C”
Problema mea este că cele două condiții 3. și 4. se pot întâmpla ambele unei mașini și nu îmi pot da seama cum să folosesc instrucțiunea continue în scriptul meu.
Acest caz specific ar fi pentru o mașină care cere un „da”, dar după aceea cere și parola.
Iată cum arată scriptul:
pentru mașină în `cat ${liste} | grep -v \#`
do
ping -c1 ${mașină} 2>&1 >/dev/null
dacă [ $? -eq 0]
atunci
echo ${mașină} >> ${pingok}
ssh -o BatchMode=da ${mașină} uname -a &> $verifssh 2>&1
eco $? > ${exitcode}
dacă grep -q „255” „$exitcode”
atunci
cut -c 15-74 $verifssh > $verifssh2
if grep "ication a failed." „$verifssh2”
atunci
așteptați ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
continua 3
elif grep „Permisiune refuzată (cheie publică, parolă, tastatură interactivă).” „$verifssh2”
atunci
așteptați ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
echo „${machine} -> Aparatul cere o parolă” >> „${sshnok}”
fi
elif grep -q "0" "$exitcode"
atunci
echo „${machine} funcționează cu ssh”
ecou „${mașină}” >> ${sshok}
fi
altfel
echo „${machine}” >> „${pingnok}”
fi
Terminat
Iată scriptul aștept (se ocupă de ambele situații):
setați mașina [lindex $argv 0]
spawn ssh $mașină
așteaptă {
„Sunteți sigur că doriți să continuați conectarea (da/nu)?” {trimiteți „da\r”;exp_continue}
-exact „Parola:” {închidere}
-re $prompt {trimite „ieșire\r”;închide}
}
Deci, pe scurt, problema mea este că pentru mașina care cere un răspuns „da” și apoi au nevoie de o parolă, vreau să le înregistrez în ${sshnok}
dosarul dar continua
nu merge. am incercat continua
/ continua 2
/ continua 3
și tot nu vrea să se întoarcă în bucla anterioară.