Список серверов для проверки доступности 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 к нему
  • X клиент, перенаправленный через SSH ", не может открыть отображение: localhost: 11.0"
  • rsync для SFTP при перемещении завершенных загрузок в другую папку
  • Пусть удаленный сеанс ssh знает о tmux?
  • SSH всегда отказывается от первой попытки подключения
  • Как я могу подтвердить идентификатор удаленного хоста SSH, к которому я пытаюсь подключиться?
  • Как ускорить X через SSH при медленном сетевом соединении?
  • Как просмотреть вывод запущенной программы поверх ssh
  • 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

    sudo: невозможно выполнить ./script.sh: нет такого файла или каталога

    Нечувствительность к регистру, дублирующая строку, удалите дубликат по выбору случая с самым высоким дублированием

    Использование сценария оболочки для извлечения данных на основе пользовательского ввода

    hardlinks, похоже, занимают несколько сотен байт только для самой ссылки (а не для файлов)

    Как правильно установить базовые диски XDG по всему миру и динамически

    Как определить, откуда появилась переменная среды

    Как найти использование пакета в Arch Linux?

    SSD в качестве кэша чтения для ЧАСТО-считываемых данных

    tar сжимает папку, но создает вложенную структуру

    Как установить среду рабочего стола на Ubuntu после базовой установки сервера

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

    Как правильно проверить оставшееся место на диске?

    Как я могу отслеживать, что использует большинство процессоров?

    Пользовательские ограничения ограничиваются только одной папкой

    du дает ошибку и результат одновременно

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