Список серверов для проверки доступности SSH

У меня есть список IP-адресов, которые мне нужны для SSH и log, если бы я мог добраться до них. Я бы использовал скрипт Ping, но DNS, возможно, уже переназначил адрес. Меня не волнуют те, с которыми я не могу добраться. Если SSH работает, мне нужно записать этот IP-адрес, мне не нужно беспокоиться о паролях или ключах, потому что я не хочу входить в это окно. Я просто хочу посмотреть, могу ли я использовать SSH для них. Пока у меня есть:

touch logfile_$(date "+%Y%m%d%T") IP_FILE="path/to/ip_address.txt" LOGFILE="path/to/logfile_$(date "+%Y%m%d%T")" if [[ ! -f ${IP_FILE} ]]; then echo "Cannot find IP address!" exit 1 fi for IP_ADDRESS in `cat $IP_FILE` ; do ssh $IP_ADDRESS >> $LOGFILE 2>&1 

Я все еще новичок в написании сценариев, и любая помощь будет отличной. Я посмотрел на «Как проверить, могу ли я войти на сервер через ssh?» отправленный LanceBaynes, но это не совсем то, что мне нужно.

Я ничего не могу установить в этих полях. Или я бы скачал хороший сканер. Как и Netcat или Nmap, оба из которых являются отличными вариантами.

  • ssh_exchange_identification: соединение закрыто удаленным хостом на машине vnx (linux)
  • Разница между «локальным переадресацией портов» и «динамической переадресацией портов»?
  • Как отслеживать ход загрузки WGET после закрытия сеанса SSH
  • ssh: определить группу серверов
  • Использование таймаута в скрипте с одной командой, но несколько хостов
  • Использование конфигурации PAM и конфигурации SSHD вместе
  • Ошибка туннелирования SSH: «канал 1: сбой при открытии: административно запрещено: открыть сбой»
  • Запретить загрузку файла через SFTP
  • 4 Solutions collect form web for “Список серверов для проверки доступности SSH”

    Метод №1: ssh-keyscan

    Один из методов заключается в использовании команды ssh-keyscan чтобы увидеть, работает ли демон ssh и работает ли он.

    Просто пропустите IP-адреса и ssh-keyscan <ip> | grep -v ... ssh-keyscan <ip> | grep -v ... каждый сервер. Если сервер существует, статус возвращается при запуске ssh-keyscan ... | grep -v ... Команда ssh-keyscan ... | grep -v ... будет 0, все остальное (1 или выше) означает, что там нет сервера.

    пример

     $ for IP_ADDRESS in `cat $IP_FILE` ; do ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1 done 

    Просто для того, чтобы разбить это немного, так что кристально ясно, что происходит, ssh-keyscan $IP_ADDRESS 2>&1 , любой возвращаемый результат (оба stderr и stdout объединяются вместе). Затем весь этот вывод передается в grep -v "^$" который возвращает 0 для строк, возвращающих выходные данные (серверы ssh работает), и 1 для серверов, которые этого не делают ( "^$" – пустая строка) ,

    Быстрая касательная на петлях (по сравнению с тем, как и как они анализируются)

    Механизм цикла выше (для цикла) работает, потому что файл содержит только строку символов, из которых ни один не является пробелом, и что каждая «строка» заканчивается новым символом строки. По умолчанию пробел является специальным символом разделения, который используется для обозначения в цикле for, как анализировать передаваемые ему аргументы. Этот символ определяется переменной $IFS и может быть переопределен, так что это, например, новый символ линии ( IFS='^M' ).

    Вы можете сделать это немного более эффективным, заменив cat $IP_FILE на $( < $IP_FILE ) . Например:

     $ for IP_ADDRESS in $( < $IP_FILE ) ; do ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1 done 

    Если строки в файле $IP_FILE включали пробелы, вы могли бы либо переопределить $IFS как обсуждалось $IP_FILE назад, так что он был установлен на ^M или вместо этого может использоваться цикл while, то есть (в while read -ra line ; do ... ; done < $IP_FILE ).

     $ while read -ra IP_ADDRESS ; do ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1 done < $IP_FILE 

    Ваш пример

     touch logfile_$(date "+%Y%m%d%T") IP_FILE="ip.txt" LOGFILE="logfile_$(date "+%Y%m%d%T")" if [[ ! -f ${IP_FILE} ]]; then echo "Cannot find IP address!" exit 1 fi for IP_ADDRESS in `cat $IP_FILE` ; do #ssh $IP_ADDRESS >> $LOGFILE 2>&1 ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null [ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1 done 

    Метод № 2: nmap

    Вы также можете сделать что-то с помощью инструмента nmap .

     $ nmap -A -iL ip.txt -p T:22 

    Это будет проходить через файл ip.txt который может содержать ip.txt хостов и IP-адреса, и сканирует каждый из них TCP-порт # 22, возвращая результаты, похожие на следующие:

     Nmap scan report for somehost.somedom.local (192.168.1.200) Host is up (0.012s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 4.3 (protocol 2.0) | ssh-hostkey: 1024 2e:32:85:a2:56:23:01:f1:c2:8f:df:aa:83:7a:1e:ad (DSA) |_2048 f6:a1:23:1d:aa:44:4a:ce:b4:d3:f4:fe:e1:00:47:b7 (RSA) 

    Рекомендации

    • Сетевая пробная версия Nmap
    • Примеры 30 команд Nmap для Sys / Network Admins

    Вы ищете утилиту netcat (двоичный исполняемый файл называется nc ). Он может выполнять различные сетевые тесты, среди которых также будет работать проверка соединения только с TCP-портом 22. Если вы используете устаревшую утилиту netcat, команда:

    nc -vz [ip.or.hostname] 22 -w [desired.timeout.value.in.seconds]

    Я считаю, что обновленная версия по умолчанию избавляется от опции -z .

    Например:

     [jadavis6@cmsoracle ~]$ nc -vz wfwhite.xxx.edu 22 -w 5 nc: connect to wfwhite.xxx.edu port 22 (tcp) timed out: Operation now in progress [jadavis6@cmsoracle ~]$ echo $? 1 [jadavis6@cmsoracle ~]$ nc -vz ditirlns01.xxx.edu 22 -w 5 Connection to ditirlns01.xxx.edu 22 port [tcp/ssh] succeeded! [jadavis6@cmsoracle ~]$ echo $? 0 [jadavis6@cmsoracle ~]$ 

    Кто-то сказал netcat, но я собираюсь рекомендовать nmap, поскольку он является одним из команд, чтобы делать то, что вы хотите.

     nmap -iL path/to/ip_address.txt -p 22 

    Это даст вам всю необходимую информацию.

    Если вы ничего не можете установить, вы должны сделать что-то вроде этого (адаптировано отсюда ):

     $ for ip in `cat ips.txt`; do ssh -o PreferredAuthentications=publickey foobar@$ip "echo ''" 2>&1 | grep denied >/dev/null && echo "$ip has SSH"; done < ips.txt 

    Трюк здесь – PreferredAuthentications . Это сообщает ssh чтобы попытаться подключиться, используя информацию ключа, хранящуюся в ~/.ssh . Пока пользователь foobar не имеет доступа к удаленной системе (измените его на любое случайное имя, которое вы хотите), соединение завершится неудачей с ошибкой «Разрешение отказа». Это означает, что grep denied будет успешным, и поэтому команда echo будет запущена. && означает запуск следующей команды, если предыдущая (здесь, grep ) была успешной.

    Если вы запустите этот скриптлет в файле, содержащем IP-адреса, он распечатает только те серверы с запущенной службой ssh.

    Interesting Posts

    m ключ не регистрируется в оболочке Bourne-Again 3.2, OSX. Угадываем?

    Команда для отображения всех изображений в каталоге в одном окне браузера, от термина?

    сжатое и несжатое ядро ​​на встроенном устройстве

    Странные символы вместо значков в Firefox

    Отсоединить клавиатуру от ядра

    sed: как отключить автозапуск через файл сценария вместо использования ключа -n?

    Может ли архив или специальный файл «содержать» разные данные на основе пароля, используемого для его открытия?

    Хотите напечатать позиционный аргумент с заменой переменных

    Заменить строку, содержащую символы новой строки

    Как преобразовать PDF-файл из серого в черно-белый?

    Ubuntu 14.10 отключается от Wi-Fi после пробуждения от приостановки

    Установка старой версии Windows 98

    однозначно удалять нежелательные строки в нескольких файлах

    как исключить диапазон чисел, используя регулярное выражение

    Почему SSH добавляет запись known_host для IP-адреса?

    Linux и Unix - лучшая ОС в мире.