Jak sprawić, by ssh nie powiodło się, zamiast pytać o hasło, jeśli uwierzytelnienie klucza publicznego nie powiedzie się?

107

Mam skrypt, który ssh'uje kilka serwerów przy użyciu uwierzytelniania za pomocą klucza publicznego. Jeden z serwerów przestał zezwalać na logowanie się skryptu z powodu problemu z konfiguracją, co oznacza, że ​​skrypt blokuje się pytaniem „Hasło:”, na które oczywiście nie może odpowiedzieć, więc nawet nie próbuje reszty serwerów na liście.

Czy istnieje sposób, aby powiedzieć klientowi ssh, aby nie monitował o hasło, jeśli uwierzytelnienie klucza nie powiedzie się, ale zamiast tego po prostu zgłosić błąd połączenia i pozwolić na kontynuowanie działania mojego skryptu?

rjmunro
źródło

Odpowiedzi:

138

W przypadku OpenSSH istnieje BatchMode, który oprócz wyłączenia monitowania o hasło, powinien również wyłączać zapytania o hasła dla kluczy.

Tryb wsadowy

Jeśli ustawione na „tak”, sprawdzanie hasła / hasła zostanie wyłączone. Ta opcja jest przydatna w skryptach i innych zadaniach wsadowych, w których nie ma użytkownika, który mógłby podać hasło. Argument musi być „tak” lub „nie”. Domyślna wartość to „nie”.

Przykładowe użycie:

ssh -oBatchMode=yes -l <user> <host> <dostuff>
Kjetil Joergensen
źródło
To dla mnie wyłączone uwierzytelnianie za pomocą klucza publicznego. Podałem jednak jako ssh user @ host -C somecommand. To, co mi się podobało, to po prostussh user@host -oPreferredAuthentications=publickey -C 'echo success'
AB Carroll
20

Dodaj następujące elementy do ~/.ssh/config:

PasswordAuthentication no

i aby wyłączyć uwierzytelnianie hasła na serwerze, dodaj tę samą linię /etc/ssh/sshd_configi uruchom ponownie sshd.

cas
źródło
7
jeśli nie chcesz wyłączać uwierzytelniania hasła dla wszystkich połączeń klienta ssh, możesz również określić opcje w wierszu poleceń. dodaj „-oPasswordAuthentication = no” do polecenia ssh.
cas
7
Nie zapobiega to pytaniu o hasło. Skrypt OP nadal się zawiesza.
Joshua Swink
11

Jeśli używasz dropbear, po prostu dodaj -sopcję „ ”, aby wyłączyć uwierzytelnianie za pomocą hasła.

sybreon
źródło
4
+1 za brak założenia, że ​​klient jest openssh :-)
cas
8

W wierszu poleceń (lub ~/.ssh/config) możesz ustawić PreferredAuthentications.

PreferredAuthentications=publickey
Rory
źródło
Myślę, że w wierszu polecenia musisz zawinąć opcję w cudzysłów, a następnie przekazać ją do opcji -o.
Craig Walker,
3
@CraigWalker Możesz również przekazać go takim, jakim jest, tj.ssh -o PreferredAuthentications=publickey
Tobias Kienzler
@CraigWalker Potrzebujesz cudzysłowów, jeśli chcesz użyć spacji do oddzielenia opcji i wartości, np.ssh "-oPreferredAuthentications publickey"
Timo