Знайте, чего ожидать
Expect — это расширение языка программирования Tcl, которое можно использовать для автоматизации внешних процессов. С помощью Expect вы можете прочитать список хостов и портов из файла и использовать Telnet, чтобы проверить, отвечает ли TCP-порт или нет.
Допустим, у вас есть следующий файл конфигурации:
google.com 80
amazon.com 80
raspberrypi 22,9090,8086,21
dmaf5 22,80
Применив немного магии Expect, вы можете автоматизировать процесс с помощью этого скрипта:
#!/usr/bin/env -S expect -f
# Poor man TCP port scanner with Telnet and Expect
# Author: Jose Vicente Nunez <@josevnz@fosstodon.org>
if { $argc == 0 } {
send_user "Please provide the data file with machine port, one per line!"
exit 100
}
set timeout 5
set f [open [lindex $argv 0]]
foreach host [split [read $f] "\n"] {
set pairs [split $host " "];
set machine [lindex $pairs 0]
set ports [lindex $pairs 1]
foreach port [split $ports ","] {
log_user 0
spawn /bin/telnet -e ! $machine $port
expect {
log_user 1
"Connection refused" { catch {exp_close}; exp_wait; send_user "ERROR: $machine -> $port\n" }
"Escape character is '!'." { send_user "OK: $machine -> $port\n"; send "!\r" }
}
}
}
close $f
Перед запуском скрипта убедитесь, что у вас установлены и Expect, и Telnet.
$ sudo dnf -y install expect telnet
Например, ваш вывод может выглядеть так:
$ ./tcp_port_scan.exp port_scan.csv
OK: google.com -> 80
OK: amazon.com -> 80
OK: raspberrypi -> 22
OK: raspberrypi -> 9090
OK: raspberrypi -> 8086
ERROR: raspberrypi -> 21
OK: dmaf5 -> 22
ERROR: dmaf5 -> 80
Когда следует использовать этот тип сценария? Expect — хорошая альтернатива, если вам нужно что-то быстрое, особенно если на одной из ваших машин уже установлены Expect и Telnet.
Однако эта решение неэффективно, поскольку вам придется создавать отдельную сессию Telnet для каждого порта, который вы хотите проверить. Вам также придется учитывать все возможные ответы от команды Telnet, а также тонкие проблемы, такие как слишком маленькое время ожидания (если порт, например, фильтруется).
Продолжение следует...
Перевод с некоторыми авторскими заголовками.
Автор оригинала: Jose Vicente Nunez (Sudoer).