Могу ли я определить, будет ли проверка подлинности ssh успешной до попытки?

У меня есть сценарий, который нужно запускать без какого-либо взаимодействия с пользователем, и ему нужно настроить отправку портов SSH. Он не должен запрашивать пароль – если SSH требуется пароль для продолжения, я хотел бы, чтобы мой скрипт ошибся.

Есть ли способ заставить SSH сказать мне, правильно ли настроен мой агент SSH для подключения к конкретному хосту перед попыткой подключения?

У ssh есть опция «BatchMode», которая заставит ее просто провалиться, а не запрашивать пароль. Это кажется намного проще, чем ваш сценарий пытается предсказать, будет ли он запрашивать пароль. Ответ на аналогичный вопрос в SuperUser указывает, что просто отключить PasswordAuthentication не всегда будет работать, потому что существует несколько различных типов интерактивной проверки подлинности, и это также не похоже на то, что это не остановит его от запроса ключевой фразы на ключе.

Вы можете использовать ssh -o BatchMode=yes или поместить его в свой ssh_config для хоста.


Кроме того, ssh не будет запрашивать пароль, если нет управляющего терминала (появляется ошибка « read_passphrase: can't open /dev/tty: No such device or address ») – вы можете запустить процесс без управления tty с setsid , который вы должны идеально делать, когда вы начинаете Jenkins, а не выполняете его специально для команды ssh (это также предотвратит sudo на пароль и т. д.),

Обратите внимание: если вы запустили процесс с помощью setsid он будет автоматически запускаться в фоновом режиме (поскольку оболочка не может работать с контролем заданий с процессами в разных сеансах), поэтому вам нужно быть готовым к этому, перенаправив его stdout / stderr в log file (и stdin to / dev / null). Вы можете получить странные результаты, если программа, запущенная в setsid пытается читать что-либо вообще со стандартного ввода, так как обычные механизмы предотвращения фонового процесса от чтения терминала не работают.

Вы не можете знать, будет ли это работать, даже не пытаясь это сделать. Есть много вещей, которые могут пойти не так.

В вашем случае, смотря на man-страницу ssh_config , я вижу, что есть опция PasswordAuthentication, которая может быть установлена ​​на no. Если посмотреть на страницу ssh man, я вижу, что есть опция -o, которую вы можете использовать для отправки параметров конфигурации в программу.

Поэтому, я думаю, вы можете использовать это, чтобы отключить PasswordAuthentication и получить то, что вы хотите.