Ваш вопрос не ясен относительно того, какие учетные данные вы используете для подключения к каждому хосту: у всех хостов, например, один и тот же метод подключения?
Предположим, что вы используете метод авторизованных ключей ssh для входа на каждый хост (т. Е. У вас есть открытый ключ на каждом хосте в файле ~/.ssh/authorized_keys
).Вы можете запустить ssh с командой do nothing для каждого хоста и посмотреть на код завершения, чтобы увидеть, было ли соединение успешным.
HOST=1.2.3.4
ssh -i /path/to/my/private.key user@${HOST} true > /dev/null 2>&1
if [ $? -ne 0]; then echo "Error, could not connect to ${HOST}"; fi
Теперь это просто случай обернуть это в некую форму цикла, где выциклически проходите по каждому хосту (и выберите правильный ключ для каждого хоста, возможно, вы могли бы назвать каждый закрытый ключ после имени или IP-адреса целевого хоста).Скрипт выйдет из всех тех хостов, для которых соединение было невозможно.Обратите внимание, что в этом сценарии предполагается, что на целевом хосте доступно true
, в противном случае вы можете использовать ls
или аналогичный.Мы перенаправляем весь вывод на /dev/null/
, так как нас интересует только возможность подключения.
РЕДАКТИРОВАТЬ В ОТВЕТЕ НА OP CLARIFICATION:
Я настоятельно рекомендую не использовать имя пользователя / пароль дляlogin, поскольку имя пользователя и пароль, скорее всего, будут где-то храниться в вашем скрипте или даже в истории вашей оболочки, если вы запускаете команду из командной строки.Если вы должны сделать это, то вы можете использовать expect
или sshpass
, как подробно описано здесь: https://srvfail.com/how-to-provide-ssh-password-inside-a-script-or-oneliner/
Показанная команда ssh не порождает оболочку, она буквально входит в систему на удаленном сервере,выполняет команду true
(или ls
и т. д.), затем завершается.Вы можете использовать код возврата ($?
в bash) для проверки правильности выполнения команды.Мой пример показывает, что распечатывается сообщение об ошибке для ненулевых кодов возврата, но для распечатки YES
при успешном соединении вы можете сделать это:
if [ $? -eq 0]; then echo "${HOST}: YES"; fi