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

Не попробовал это самостоятельно, но как насчет этого:

tar xvf archive.tar | head -n50

Tar производит строку к STDOUT для каждого извлеченного файла, затем head команда уничтожит канал после 50 строк. После смерти канала я ожидал бы, что tar умрет также.

6
05.07.2013, 16:56
4 ответа

Метод № 1: ssh-keyscan

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

Просто цикл через IP-адреса и ssh-keyscan <ip> | 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 для серверов, которые не делают ( "^$" пустая строка).

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

Механизм цикличного выполнения выше (для цикла) работает, потому что файл только содержит строку символов, из которых ни один не пространство и что каждая "строка" завершается символом новой строки. По умолчанию пространство является специальным разделительным символом, который это используется для обозначения к для цикла, как проанализировать аргументы, передаваемые ему. Этот символ определяется переменной $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 как обсуждено момент назад так, чтобы это было установлено на ^M или некоторое время цикл мог использоваться вместо этого, т.е. (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-адреса и просканирует каждый порт 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)

Ссылки

11
27.01.2020, 20:20
  • 1
    При выполнении этого я добираюсь [: пропавшие без вести']' ошибка на [$? == 0] && повторяют $IP_ADDRESS>> 2$LOGFILE> &1. какие-либо идеи? –  Dolyak 05.07.2013, 16:47
  • 2
    хорошо дает мне одну минуту. Спасибо за Вашу справку btw. –  Dolyak 05.07.2013, 17:04
  • 3
    Почему Вы используете for и cat вместо while и <? –  terdon♦ 05.07.2013, 17:08
  • 4
    Хорошо поэтому, когда я выполняю его, я не получаю помещенный даже при том, что дюйм/с, которого я имею в файле (все кроме одного) является допустимыми серверами, в которые я могу ssh. –  Dolyak 05.07.2013, 17:30
  • 5
    @terdon - не знают, я всегда использую для циклов - никакая техническая причина. –  slm♦ 05.07.2013, 17:31

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

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

Это даст Вам всю информацию, в которой Вы нуждаетесь.

4
27.01.2020, 20:20

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

$ 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) было успешно.

При выполнении этого scriptlet на файле, содержащем дюйм/с он распечатает только те серверы с выполнением ssh сервис.

1
27.01.2020, 20:20
  • 1
    Вы могли бы хотеть добавить команду к ssh вызов, иначе это попытается породить терминальный сеанс с каждым сервером. В связанном примере они делали это путем передачи $COMMAND к ssh вызов. –  Bratchley 05.07.2013, 17:34
  • 2
    Как Joel сказал, если Вы делаете прямое ssh Вы открываете соединение, которое является, почему я старался избегать его, при помощи ssh-keyscan или что-то еще такой как nc или nmap. –  slm♦ 05.07.2013, 17:37
  • 3
    @JoelDavis да, я предполагал, что OP не будет иметь доступа для упрощения решения. Ответ изменяется. –  terdon♦ 05.07.2013, 17:51
  • 4
    @terdon - избавление от соединения является небольшим количеством боли, хорошая идея там. Если он не может ssh к системе без открытого ключа это не будет работать хотя, правильно? –  slm♦ 05.07.2013, 17:52
  • 5
    @slm я изменил это решение немного при помощи не существующего имени пользователя, тот способ, которым необходимо всегда получать ошибку "Доступа запрещен" от серверов, которые имеют настроенный ssh. –  terdon♦ 07.07.2013, 17:11

Вы ищете 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 ~]$
4
27.01.2020, 20:20
  • 1
    Хорошее решение, BTW! –  slm♦ 05.07.2013, 16:27
  • 2
    Это - Отличное решение, но я не могу использовать Netcat на этом поля. –  Dolyak 05.07.2013, 16:45

Теги

Похожие вопросы