LINUX.ORG.RU

Вывод Результатов nmap Через grep

 , ,


0

1

Хотел сделать автоскан, который проверяет открыт ли определенный порт на машинах и у меня возникло два вопроса, во первых как сделать так что бы результаты забирались по мере сканирования, а не при его окончании? Если брать большой диапазон, nmap может встать и перестать что либо делать и не хотелось бы самостоятельно потом доставать адреса из отчета. И ещё, адреса записываются в одну строку, как можно поставить между ними какой ни будь \n?

while nmap -T4 -p 80 -Pn -iL ip.txt | tee N_ips.txt; #можно было бы сделать pipe, но велик шанс вообще так потерять все результаты если nmap затупит.

grep -B5 «80/tcp open» N_ips.txt | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" > tstres.txt;

cat tstres.txt; #при выполнении этой команды они идут по строкам, то есть на одной строке один ip. Если же их направить в файл, то все снова в одной строке без пробелов.

Хотел сделать через for, но не работает. И да бывает nmap зависает и перестает что либо делать, реально ли поставить какой ни будь таймаут или эта утилита вообще не подходит для диапазонов.

Все это я пишу в Bash, попутно изучая его с нуля, так что возможно я выбираю не лучшие решения проблем, но хочется разобраться с этим для личного развития. Буду благодарен за ответы.


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

Через pipe: nmap ... | while read LINE; do ... .
P. S. Там есть нюанс состоящий в том, что существует некий буфер, а значит на вход read вывод nmap может попасть не сразу, а после нескольких линий. Обычно это неважно, но если тебя это не устраивает, погугли на тему как отключить буффер в pipe, там оно через какую-то команду будет запускаться.

И ещё, адреса записываются в одну строку, как можно поставить между ними какой ни будь \n?

Покажи пример, тебе быстро напишут соотв. регулярку для sed.

И да бывает nmap зависает и перестает что либо делать, реально ли поставить какой ни будь таймаут или эта утилита вообще не подходит для диапазонов.

--host-timeout?

Kroz ★★★★★
()

И ещё, адреса записываются в одну строку, как можно поставить между ними какой ни будь \n?

Если я правильно понял, о чем речь, то nmap -oG N_ips.txt.

dexpl ★★★★★
()
Ответ на: комментарий от Kroz

как отключить буффер в pipe

не гуглится:

the capacity can be queried and set using the fcntl(2) F_GETPIPE_SZ and F_SETPIPE_SZ operations. See fcntl(2) for more information.

но это же функция API, а не утилита...

Einstok_Fair ★★☆
()
Ответ на: комментарий от Einstok_Fair

Шутишь?

google:// bash pipe buffer disable

Первые три ссылки
https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe
https://unix.stackexchange.com/questions/116453/how-to-control-buffering-of-p...
https://stackoverflow.com/questions/3465619/how-to-make-output-of-any-shell-c...

Там несколько решений, я не помню какое сработало у меня, нужно пробовать.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

Сейчас это выглядит так:

#!/bin/bash nmap -T4 -p 80 -Pn -iL ip.txt --max-retries 3 --min-hostgroup 100 --max-hostgroup 600 --host-timeout 180s | tee N_ips.txt | while read LINE do grep -B5 «80/tcp open» N_ips.txt | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" > tstres.txt; done cat tstres.txt

Главное while пытался сделать, но хотело нормально идти, сейчас вроде норм. Но я while ставил в начало строки.

sed хотел таким сделать, но не получилось:

~ |sed 's/([0-9]{1,3}[\.]){3}[0-9]{1,3} / ([0-9]{1,3}[\.]){3}[0-9]{1,3} \n /' > tstres.txt; #пробелы что бы было видно разделение

Видимо он не читает реулярное выражение, не знаю как поставить выводимые ip может как то с помощью <cat tstres.txt , но не думаю что можно вставить это все.

mCstl
() автор топика
Ответ на: комментарий от Kroz

я не помню какое сработало у меня

И не стыдно вот так откровенно говорить, что скастовал несколько магических заклинаний и вроде одно помогло? :)

Если утилита буферизует вывод, то не помогут самые прикольные заклинания из ссылок по поводу впихивания искомой утилиты в терминальное окружение для stdout, ибо stdout извне не управляется. А уж stdbuf так и вообще может влиять только на встроенное в bash.

vodz ★★★★★
()
Ответ на: комментарий от Einstok_Fair

the capacity can be queried and set using the fcntl(2) F_GETPIPE_SZ and F_SETPIPE_SZ operations. See fcntl(2) for more information.

но это же функция API, а не утилита..

Этот системный размер буфера пайпа управляет размером при котором надо будить вторую сторону, которая читает из трубы. Но обычно проблема интерактивных утилит через пайп в том, что они буферизуют сами, не передавая до определённого размера системе ничего вообще. И если эти утилиты работают с терминалом (или как тут накидал Kroz ссылок в виде эмуляции терминала), то можно надеяться, что хоть полные строки будут передаваться сразу, но управлять внешними средствами поточнее в принципе не возможно.

vodz ★★★★★
()
19 октября 2017 г.
Ответ на: комментарий от Kroz

Здравствуйте. В продолжении темы, я хотел немного все усложнить и дать возможность сканировать разные порты, но встретился с ошибкой. Сейчас скрипт запускаю из под винды через GIT, в PATH прописал 2 возможных пути и получаю вот такую ошибку в восьмой строке " 80=80: command not found ". Пробовал помещать скрипт в папку с прогой и писать ./nmap или ./nmap.exe, собственно без результатно. Все что на этот момент нашел попробовал, не помогло.

#! /bin/bash
export PATH=$PATH:/c/'Program Files (x86)'/Nmap/:/c/Program\ Files\ \(x86\)/Nmap/
echo -n "Выберите порт (80, 8000, 3389, 135): \"prt\" " 
read prt
if $prt=80 
then
nmap -T4 -p 80 -Pn -iL ip.txt --max-retries 3 --min-hostgroup 100 --max-hostgroup 600 --host-timeout 180s | grep -B5 "80/tcp open" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" > p80res.txt;
fi

(на nmap -oG пока что забил, это не суть)

mCstl
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.