Как передать несколько строк параметру без цикла for?

У меня есть следующая команда для обработки вывода nmap, содержащего список ips, которые мне просили сканировать:

cat ping-sweep.txt | grep "report for" | cut -d " " -f5 

Это дает мне список только ip (по одному на строку), который я бы хотел отсканировать для веб-серверов.

Я могу сканировать отдельный хост следующим образом:

 nmap -v -p 80,443,8080 10.1.1.1 

Я бы хотел выполнить это сканирование на каждом ip в моем списке, однако его использование в nmap не работает. Нужно ли создавать сценарий bash с помощью foreach чтобы сделать это, или есть что-то простое, что мне не хватает?

  • Как написать скрипт для автоматической компиляции и установки всех модулей Moksha?
  • Как изменить / исправить команду v меньше, используя профиль оболочки?
  • Как использовать printf и% s при наличии цветовых кодов?
  • Извлечение строк между специальными символами
  • Как запустить сценарий оболочки с двойным щелчком в CentOS 7
  • bash если вопрос поведения инструкции
  • Изменяйте определенные байты во многих файлах
  • Вывод содержимого конвейера в файл и отображение количества строк в файле на stdout
  • 3 Solutions collect form web for “Как передать несколько строк параметру без цикла for?”

    Первым шагом будет попытка использовать Nmap так, как он был разработан. Поскольку Nmap выполняет обнаружение хоста («ping sweep») перед каждым сканированием портов, вы можете выполнить оба действия одновременно с помощью этой простой команды:

     nmap -p 80,443,8080 [TARGETS] 

    Если вам действительно нужно выполнить обнаружение хоста отдельно от сканирования порта, то используйте надежные машинные возможности вывода Nmap, такие как XML или Grepable . Для более старых версий Nmap самым простым способом было бы сделать обнаружение хоста и сохранить вывод Grepable следующим образом:

     nmap -sn [TARGETS] -oG ping-sweep.gnmap 

    Затем вы можете легко извлечь IP-адреса с помощью awk:

     awk '/Status: Up/{print $2}' ping-sweep.gnmap > targets.txt 

    и импортировать их непосредственно в Nmap:

     nmap -p 80,443,8080 -iL targets.txt 

    В качестве альтернативы, с Nmap 7.00 или новее, вы можете использовать формат вывода XML, сохраненный с -oX ping-sweep.xml и -oX ping-sweep.xml -xml :

     nmap -p 80,443,8080 --script targets-xml --script-args newtargets,iX=ping-sweep.xml 

    При любом из этих параметров, если сканирование обнаружения хоста достаточно недавно, вы можете добавить параметр -Pn чтобы пропустить этап обнаружения хоста сканирования порта. Это экономит вам небольшую скорость сканирования, так как вы должны быть в состоянии рассчитывать на те же самые хосты, которые все еще работают.

    То, что вам действительно не нужно делать, – это любое решение, включающее циклы или xargs , так как в итоге они запускают отдельный экземпляр Nmap для каждой цели. Это расточительно и ненужно, так как каждому экземпляру придется дублировать работу по загрузке файлов данных и отправке временных зондов для мониторинга пропускной способности сети, а отдельные экземпляры будут конкурировать друг с другом за сетевые ресурсы, а не за сотрудничество. Кроме того, в конце концов вам придется рекомбинировать свои отдельные выходы.

    В общем случае вы можете использовать xargs для передачи каждой строки в качестве аргумента командной строки для команды, например:

     cat ping-sweep.txt | grep "report for" | cut -d " " -f5 | xargs -I'{}' nmap -v -p 80,443,8080 '{}' 

    Вы можете дать nmap все адреса для сканирования в качестве параметров, например:

     nmap -v -p 80,443,8080 $(grep "report for" ping-sweep.txt | cut -d" " -f5) 

    Это запускает grep в вашем файле (нет необходимости в cat ), затем фильтрует выход grep через cut , и результат этого используется для создания командной строки nmap . Это называется подстановкой команд .

    В оболочке есть петли, и вы можете использовать их разными способами:

     grep "report for" ping-sweep.txt | cut -d" " -f5 | while read ip; do nmap -v -p 80,443,8080 "${ip}" done 

    или

     for ip in $(grep "report for" ping-sweep.txt | cut -d" " -f5); do nmap -v -p 80,443,8080 "${ip}" done 

    Оба они будут запускать nmap с одним адресом за раз.

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