Как проверить, могу ли я войти на сервер через ssh?

13

У меня есть список серверов:

cat list.txt
10.10.10.10 servera
10.11.10.10 serverb

Как я могу проверить, могу ли я войти через ssh к ним или нет? Я имею в виду, что по умолчанию я должен быть в состоянии войти через ssh key auth .., так что вкратце, мне нужно решение, которое сортирует строки (серверы) в list.txt следующим образом:

  • серверы, на которые я могу войти через ключ ssh
  • серверы, запрашивающие пароль (конечно, пароль неизвестен ..)
  • серверы, которые недоступны
LanceBaynes
источник
с помощью команд ssh и ping вы можете достичь этого
Balaswamy vaddeman
pingне очень хороший показатель. Существует множество настроек, которые разрешают sshсоединения, но не отвечают на эхо-запросы.
Мат

Ответы:

25

Вы можете сделать это с помощью комбинации BatchModeопции и «разбора» вывода. ( sshвсегда возвращает 255, если по какой-либо причине не удается подключиться, поэтому вы не можете использовать код возврата для различения типов сбоев.)

При BatchModeвключенном состоянии не запрашивается пароль или другое взаимодействие, поэтому подключение, для которого требуется пароль, не будет выполнено. (Я также вставил ConnectTimeoutтуда, который должен быть настроен в соответствии с вашими потребностями. И выбрал действительно плохие имена файлов.)

#! /bin/bash

rm good no_auth other
while read ip host ; do
    status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 $ip echo ok 2>&1)
    case $status in
        ok) echo $ip $host >> good ;;
        *"Permission denied"*) echo $ip $host $status >> no_auth ;;
        *) echo $ip $host $status >> other ;;
    esac
done < list.txt

Вы можете обнаружить другие типы ошибок (например, отсутствие открытого ключа сервера), если вам нужна более подробная классификация. Если вам нужны результаты в одном отсортированном файле, просто catобъедините различные выходные файлы, как считаете нужным.

Мат
источник
1

Посмотрите различные инструменты, которые автоматизируют выполнение команд на нескольких хостах через ssh. Например, с Муссом :

mussh -H hosts.txt -o ConnectTimeout=5 -P -d -c 'echo `hostname` is alive'

Массаж выходной по мере необходимости.

Примечание: почему вы храните IP-адреса в list.txt? Имен серверов достаточно. Если имена, которые вы хотите использовать, не являются именами DNS, используйте Hostдирективы в ~/.ssh/config.

Жиль "ТАК - прекрати быть злым"
источник
0
servers that I can log in via ssh key
servers that prompts for password (of course password is unknown..)

Ожидайте, будет предоставлять вход для ваших интерактивных команд. Клиент ssh с флагом -v сообщит вам, какие методы аутентификации принимает сервер. Если вы попадаете в интерактивное приглашение, сделайте так, чтобы оно прекратилось. Делай, что хочешь, у тебя есть все, что тебе нужно.

servers that are unreachable

То же самое, одна команда, чтобы управлять ими всеми, и в темноте, связать их ... Гул.

Aki
источник
0

Команда mussh будет выводить только ошибки, поэтому вы можете просто запустить ее без отладки.

$ cat list.txt
10.1.2.93       trustme
10.1.2.92       wobudong
10.41.41.41     failhost

$ awk '{print $2}' list.txt | mussh -H - -t 10 -m -c hostname
trustme: trustme
failhost: ssh: Could not resolve hostname failhost: Name or service not known
wobudong: ssh: connect to host wobudong port 22: Connection timed out
pdxdoughnut
источник