У меня есть сценарий, который SSHes несколько серверов с использованием аутентификации с открытым ключом. Один из серверов перестал позволять скрипту войти в систему из-за проблемы с конфигурацией, что означает, что скрипт застревает с приглашением «Пароль:», на которое он, очевидно, не может ответить, поэтому он даже не пробует остальные серверы. в списке.
Есть ли способ указать клиенту ssh не запрашивать пароль в случае сбоя аутентификации ключа, а вместо этого просто сообщать об ошибке подключения и позволить моему сценарию продолжить работу?
Для OpenSSH есть режим BatchMode, который помимо отключения запроса пароля должен отключить запрос парольной фразы (фраз) для ключей.
Пакетный режим
Если установлено «да», запрос парольной фразы / пароля будет отключен. Эта опция полезна в сценариях и других пакетных заданиях, где нет пользователя, который мог бы указать пароль. Аргумент должен быть «да» или «нет». По умолчанию - «нет».
Пример использования:
ssh -oBatchMode=yes -l <user> <host> <dostuff>
Чтобы отключить аутентификацию по паролю для текущей попытки подключения ssh, передайте этот параметр в командной строке:
-o PasswordAuthentication=no
Чтобы отключить аутентификацию по паролю для всех будущих подключений к любому хосту, добавьте в свой ~/.ssh/config
:
PasswordAuthentication no
Чтобы отключить его только для некоторых хостов, добавьте в ~ / .ssh / config следующее:
Host host1 host2 host3...
PasswordAuthentication no
Приведенные выше параметры применимы к уходящий ssh-соединения, то есть где вы пытаетесь подключиться к удаленному ssh-серверу.
Чтобы отключить аутентификацию по паролю на ssh-сервере (т.е. применяется ко всем входящий ssh-соединения), добавьте PasswordAuthentication no
к /etc/ssh/sshd_config
и перезапустить sshd
.
Если вы используете dropbear, просто добавьте "-s
"возможность отключить аутентификацию по паролю.
В командной строке (или ~/.ssh/config
) вы можете установить PreferredAuthentications
.
PreferredAuthentications=publickey
Вот пример фрагмента сценария sftp bash. Я использую «-o BatchMode = Yes», чтобы отключить запрос пароля в случае сбоя. И проверьте код возврата frp, чтобы убедиться, что ftp-соединение не удалось.
sftp -o "IdentityFile=<YOUR_IDENTTIY_FILE>" -o "BatchMode=Yes" userName@ftpserver.com <<EOF
cd /$remotepath
mget *.csv $localpath/download
quit
EOF
exit_code=$?
if [[ $exit_code != 0 ]]; then
echo "sftp error, failed to connect to ftp server" >&2
exit 1
fi