2012-07-12 2 views
3

Итак, я использую netstat -lt для открытия открытых портов. Однако меня не интересуют определенные значения (например, SSH или 22), поэтому я хочу, чтобы их можно было исключить. Я также хочу получить их как массив в bash. Пока у меня есть netstat -lt | sed -r 's/tcp[^:]+://g' | cut -d' ' -f1, но они не массив, и я ничего не исключаю.Получите открытые порты как массив

ответ

2

Добавить ($()) вокруг заявления:

port=($(netstat -ltn | sed -rne '/^tcp/{/:(22|25)\>/d;s/.*:([0-9]+)\>.*/\1/p}')) 

Фильтрация портов 22 и 25.

+0

Не работает? Я сделал «echo $ port» в качестве следующей строки, и все, что было напечатано, было «Активно». Кроме того, это не позволяет исключить определенные значения. –

+0

'echo $ {port [@]}' Это массив, как и требовалось – fork0

+0

Но это отвратительно ... Интересно, может ли программа sed быть улучшена ... – fork0

0
a=(`netstat -ltn --inet | sed -r -e '1,2d''s/tcp[^:]+://g' | cut -d' ' -f1 | sed -e '1,2d' | grep -v "22\|33\|25"`) 

второй СЕПГ команда удаляет заголовки, если ваша версия NETSTAT отпечатков таких. У меня есть «Активный» и «Прото» в качестве первых двух строк. Используйте grep для фильтрации нежелательных портов. добавьте -n в netstat, чтобы видеть номера портов вместо имен. --inet - заставить ipv4, иначе вы можете увидеть IPv6, который может смутить ваш скрипт.

btw не уверен, что вам нужен массив. обычно массивы нужны только в том случае, если вы собираетесь работать над поднабором значений, которые у вас есть. Если вы работаете со всеми значениями, есть более простые конструкции, но не уверен, что вы собираетесь делать.

С уважением.

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

sed -r -e '1,2d' -e 's/tcp[^:]+://g' 
2

Попробуйте использовать ss команду, которая заменяет netstat.

ss -atu | awk '{print $5}' | awk -F: '{print $NF}' 

Команда ss дает все TCP и UDP порты на локальной машине (только розетки, которые имеют порты). Первый awk извлекает столбец, содержащий локальный адрес и номер порта. Второй awk занимает только последнее поле после двоеточия; это необходимо, если у вас есть сокеты IPv6 на вашем компьютере, чей IP-адрес также будет содержать двоеточия.

Как только вы это сделаете, вы можете вывести grep из портов, которые вам не нужны. Также см. Документацию, указанную на странице руководства пользователя ss, для получения информации об фильтрах, которая может позволить вам отфильтровать нежелательные сокеты с вывода ss.

+0

Я ожидал, что смогу свести две команды 'awk' к одной простой команде, но самое короткое, что я могу придумать, это:' ss -atu | awk '{old = FS; FS = ":"; $ 0 = $ 5; print $ NF; FS = old} '. – Thor

Смежные вопросы