Список серверов для проверки доступности 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 перенаправленный графический интерфейс
  • Вызов Bash продолжает исчезать
  • Ошибка sshfs: сброс соединения с помощью сверстника
  • passwordless ssh setup без каталога пользователя
  • Как туннель SSH через SSH?
  • SSH-туннель с autossh
  • Не удается открыть графический интерфейс после ssh -X и chroot
  • 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

    Объединить столбцы с помощью awk? (Или другие предложения)

    Подстановка команд против перенаправления ввода-вывода?

    Кросс-компиляционное ядро ​​не может найти gcc

    хотите su без пароля внутри сценария оболочки

    Emacs: открыть буфер со всеми строками между строками X и Y из огромного файла

    невозможно создать ключевое слово id_resolver для сопоставления идентификаторов nfs

    Использовать тот же IP-адрес для 2 адаптеров Ethernet в разных физических сетях

    Где я должен устанавливать сторонние двоичные программы?

    Список ресурсов Linux Mint 15 Olivia

    Переименуйте файлы, чтобы добавить начальные нули в числа

    mknod содержимого в каталоге

    Должен ли демон-демона самонадеянно себя зарекомендовать?

    Найти только первые несколько файлов с помощью find?

    данные о трубах в процесс, который уже запущен

    Сканирование сети HP LaserJet M1536DNF на Scientific Linux 6.4 – Ошибка во время ввода / вывода устройства

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