Не попробовал это самостоятельно, но как насчет этого:
tar xvf archive.tar | head -n50
Tar производит строку к STDOUT для каждого извлеченного файла, затем head
команда уничтожит канал после 50 строк. После смерти канала я ожидал бы, что tar умрет также.
Один метод должен был бы использовать команду 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
Можно также сделать что-то с инструментом 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)
Кто-то упомянул 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
) было успешно.
При выполнении этого scriptlet на файле, содержащем дюйм/с он распечатает только те серверы с выполнением ssh сервис.
ssh
вызов, иначе это попытается породить терминальный сеанс с каждым сервером. В связанном примере они делали это путем передачи $COMMAND
к ssh
вызов.
– Bratchley
05.07.2013, 17:34
ssh
Вы открываете соединение, которое является, почему я старался избегать его, при помощи ssh-keyscan
или что-то еще такой как nc
или nmap
.
– slm♦
05.07.2013, 17:37
ssh
к системе без открытого ключа это не будет работать хотя, правильно?
– slm♦
05.07.2013, 17:52
Вы ищете 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 ~]$
for
иcat
вместоwhile
и<
? – terdon♦ 05.07.2013, 17:08