Извлечение результатов из команды в терминале

Есть возможность для пользователя в системе (или программы мониторинга, которая перехватывает ps вывод) увидеть пароль как параметр процесса groupadd - если пользователь или монитор "случайно" запустит ps во время работы процесса groupadd. Риск того, что это произойдет, невелик (процесс groupadd, скорее всего, завершится довольно быстро), но ненулевой.

Убедитесь сами в этом надуманном примере; выполните эти две строки в течение 10 секунд друг после друга:

$ sh -c "echo groupadd -p password-here > /dev/null; sleep 10" &
$ ps -ef | grep password
3
30.07.2017, 15:22
3 ответа

Вы можете попробовать использовать команду awk следующим образом:

nmap -sP 192.168.1.* | awk -F"[)(]" '/^Nmap/{Nmap=$(NF-1); C+=1} /^MAC Address/{print C"."$(NF-1) "("Nmap")" }' 

выход,

1. Apple (192.168.1.21)
2. Liteon Technology (192.168.1.15)

пояснения:

  • при открытии awk -Fвы сообщаете 'awk', что ваши входные данные ограничены (и/или ), как мы указали в группах разделителей-F"[)(]"

  • '/.../{...} /.../{...}', это тело сценария awk, которое в вашем случае будет выполняться только первым /^Nmap/{Nmap=$(NF-1); C+=1}или вторым /^MAC Address/{print C"."$(NF-1) "("Nmap")" }или ни одной из этих двух частей условия, где мы указали, запускается только в том случае, если входная строка или строка начинается (^, который является якорем начальной строки и указывает на начало строки/записи )с шаблонамиNmap(или во второй части MAC Address). любое найденное совпадение будет запускать коды внутри фигурных скобок{...}

Что делает первая часть?
Как объяснялось выше, если совпадение найдено, то сохраняется предпоследнее поле (NF, указывающее на последнее поле (или его возвращаемое количество полей в записи на основе определенных разделителей, и $NFего значение )значение в переменной Nmapс $(NF-1); C+=1- это переменная флага счетчика, которую мы использовали для подсчета количества совпадений, а также в конце, используя для списка идентификаторов в выводе

Что делает вторая часть?
то же, что и выше, но когда совпадение найдено ^MAC Address, затем сначала выведите значение счетчика C, выведите точку ., затем выведите предпоследнее поле совпадающей строки и в конце выведите значение 'Nmap' в паратециях. который является IP-адресом предыдущей совпадающей строки

6
27.01.2020, 21:09

Вы можете использовать выходной формат xml:

nmap -n -sP -oX - 192.168.1.0/24 | xmlstarlet sel -t \
  -m //host \
  -v address/@vendor \
  -o ' (' -v 'address[@addrtype="ipv4"]/@addr' -o ')' -n
3
27.01.2020, 21:09

Предпочтительнее использовать awk. Хороший лайнер. Но просто показать другое решение:

#!/bin/bash

COUNTER=0
IP=
COMPANY=

nmap -sP 192.168.1.* | while read line
do
    if [[ "$line" =~ ^Nmap ]]; then
        IP=$(echo "$line" | sed -e "s/.*(\(.*\))/\1/")
    fi
    if [[ "$line" =~ ^MAC ]]; then
        COMPANY=$(echo "$line" | sed -e "s/.*(\(.*\))/\1/")
        COUNTER=$((COUNTER+1))
        echo "${COUNTER}. ${COMPANY} (${IP})"
        IP=
        COMPANY=
    fi
done

Объяснение команд sed:

Первая команда sed извлекает IP-адрес из строк в формате Nmap scan report for macbook.att.net (192.168.1.21). Команда sed использует довольно простое регулярное выражение (. Мне также следовало использовать якоря и классы символов, чтобы быть уверенным, что я извлекаю IP-адрес )с помощью группы захвата. Первая часть команды sed (между первой и второй/)— это строка для сопоставления, .*(\(.*\)). .*(соответствует любому (или отсутствию символов ), за которыми следует открывающая скобка. Группа захвата следующая, это \(.*\), которая захватывает любое количество символов (в производственной среде, это должно измениться на регулярное выражение, соответствующее формату IP-адреса ). Концом полного регулярного выражения является один ). Вторая часть команды sed (между второй и третьей/)— это то, чем заменяется регулярное выражение. В данном случае просто \1, что указывает на то, что было в первой группе захвата.

Вторая команда sed в основном то же самое, то есть «сопоставьте строку, содержащую набор скобок в конце, замените всю строку тем, что было внутри скобок».

Сложность заключается в том, что когда вы не используете флаг для использования расширенных регулярных выражений, (и )являются буквальными. Открывать и закрывать скобки. Их нужно экранировать, \(и \), чтобы указать, что они используются для группировки.

Наконец, опция -e, которую я использую в команде.В этом случае это необязательно, так как каждая команда sed имеет только один скрипт/регулярное выражение. У меня привычка всегда им пользоваться.

Рекомендуем к прочтению справочные страницы regex(3), regex(7), которые иногда называют re_format(7), и книгу О'Рейли "Освоение регулярных выражений" Джеффри Фридла.

3
27.01.2020, 21:09

Теги

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