Есть возможность для пользователя в системе (или программы мониторинга, которая перехватывает ps
вывод) увидеть пароль как параметр процесса groupadd - если пользователь или монитор "случайно" запустит ps
во время работы процесса groupadd
. Риск того, что это произойдет, невелик (процесс groupadd, скорее всего, завершится довольно быстро), но ненулевой.
Убедитесь сами в этом надуманном примере; выполните эти две строки в течение 10 секунд друг после друга:
$ sh -c "echo groupadd -p password-here > /dev/null; sleep 10" &
$ ps -ef | grep password
Вы можете попробовать использовать команду 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-адресом предыдущей совпадающей строки
Вы можете использовать выходной формат 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
Предпочтительнее использовать 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)
, и книгу О'Рейли "Освоение регулярных выражений" Джеффри Фридла.