Как я могу перечислить мои открытые сетевые порты с помощью netstat?

206

Я хотел бы перечислить мои открытые сетевые порты в терминале со встроенными командами. Как я знаю, netstatэто команда для использования. Но я изо всех сил пытаюсь получить любую полезную информацию из этого.

Как я могу перечислить мои открытые порты с netstat? Какие-нибудь конкретные флаги, которые мне помогают в этом случае?

Jonas
источник

Ответы:

310
netstat -ap tcp | grep -i "listen"

Achive Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)   
tcp4       0      0  localhost.25035        *.*                    LISTEN
sudo lsof -PiTCP -sTCP:LISTEN

COMMAND     PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
GitHub      850 grgarside   6u   IPv4 0x23c345381d089301      0t0  TCP localhost:25035 (LISTEN)
Grg
источник
2
Спасибо! Тем не менее, вывод довольно трудно читать, но lsofбыл немного лучше, спасибо.
Йонас
12
Вам нужно использовать sudo lsof .... Без sudo lsof может видеть только ваши собственные процессы и, следовательно, не будет отображать порты, открытые системными процессами. Кроме того, вы можете пропустить команду grep, сообщив lsof, что вы хотите видеть только порты в состоянии LISTEN sudo lsof -PiTCP -sTCP:LISTEN.
Гордон Дэвиссон
1
→ grgarside: остерегайтесь эффектов из grep -i "listen"ваших 2 примеров.
дан
1
С помощью GNU netstatвы можете при желании перечислить pid процесса, который открыл каждый порт. Есть ли способ получить такое поведение с BSD netstat?
Крис
2
Я только что сделал, оказывается, -vфлаг включает это. Pid будет в колонке от второго до последнего.
Крис
64

может быть, вы можете использовать lsof:

lsof -Pn -i4

-i4 означает только показывать адрес и порты ipv4 -P и -n быстрый вывод

вывод, как это

  lsof -Pn -i4 | grep LISTEN
QQPlatfor 22767 xxxx   15u  IPv4 0x36c2bfa04e49385d      0t0  TCP *:49969 (LISTEN)
GoAgentX  33377 xxxx    4u  IPv4 0x36c2bfa06e68b12d      0t0  TCP *:56154 (LISTEN)
GoAgentX  33377 xxxx   20u  IPv4 0x36c2bfa04e492f8d      0t0  TCP 127.0.0.1:56155 (LISTEN)
strivescript
источник
2
Что делает эта команда?
Nohillside
3
lsofсписки открытых файлов. Сетевые сокеты считаются файлами, поэтому каждый открытый сетевой сокет (либо прослушивающий, либо активно используемый) будет указан в lsof.
Крейг Трейдер
Он также показывает идентификатор процесса (netstat не делает)
lib
1
lsof -Pn -i6для IPV6
Джаред Берроуз
2
По крайней мере, у одной моей машины этот ответ занимает 0,1 с, а у @ grgarside - более 28 с. Разница заключается в том, что -i4переключатель предназначен только для просмотра адресов IPv4.
Davor Cubranic
8

Самый простой способ - использовать netstat:

$ netstat -ap tcp
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  10.0.2.23.58792        17.172.233.109.5223    ESTABLISHED
tcp4      87      0  my_iMac__at_home.55481 stackoverflow.co.http  ESTABLISHED
tcp4     116      0  my_iMac__at_home.55478 stackoverflow.co.http  ESTABLISHED
tcp4      58      0  my_iMac__at_home.63452 stackoverflow.co.http  ESTABLISHED
tcp4      87      0  my_iMac__at_home.63429 stackoverflow.co.http  ESTABLISHED
tcp4       0      0  localhost.63173        localhost.773          ESTABLISHED
tcp4       0      0  localhost.773          localhost.63173        ESTABLISHED
tcp4       0      0  localhost.63173        *.*                    LISTEN     
tcp4       0      0  localhost.63172        *.*                    LISTEN     
tcp4       0      0  localhost.ipp          *.*                    LISTEN     
tcp6       0      0  localhost.ipp          *.*                    LISTEN     

… Без какой-либо дополнительной фильтрации, чтобы получить правильные заголовки и увидеть, что оба сервера прослушивают, а соединения уже установлены в обоих направлениях. В этом примере 1-я строка показывает связь с моим Mac в направлении 17.172.233.109, что еще:

whois 17.172.233.109

научил меня, что находится в Apple.

Дан
источник
7

Во-первых, я не эксперт BSD, но, как и OP, я хотел получить грубый эквивалент запуска следующего в * nix-окне или чего-то близкого:

netstat -tulpn

Я читал другие вопросы / ответы, предлагающие lsof * и netstat * на MacOS, и я все еще хотел что-то более компактное. Итак, вот что я быстро соединил:

netstat -Watnlv | grep LISTEN | awk '{"ps -o comm= -p " $9 | getline procname;colred="\033[01;31m";colclr="\033[0m"; print cred "proto: " colclr $1 colred " | addr.port: " colclr $4 colred " | pid: " colclr $9 colred " | name: " colclr procname;  }' | column -t -s "|"

Это немного излишне, поэтому я добавил цвет в вывод для хорошей меры. Так как я не смогу запомнить или захотеть напечатать этого бегемота. Я помещаю его в функцию bash, а затем просто вызываю его, когда это необходимо. Вот эта функция bash:

macnst (){
    netstat -Watnlv | grep LISTEN | awk '{"ps -o comm= -p " $9 | getline procname;colred="\033[01;31m";colclr="\033[0m"; print colred "proto: " colclr $1 colred " | addr.port: " colclr $4 colred " | pid: " colclr $9 colred " | name: " colclr procname;  }' | column -t -s "|"
}

У меня есть небольшая коллекция этих вспомогательных функций в файле, который я получаю из ~ / .bash_profile или ~ / .zshrc. Это добавляется в коллекцию. Было бы интересно увидеть другие возможности сделать это лучше / стройнее.

Пример вывода:

> macns
proto: tcp4     addr.port: 127.0.0.1.9999     pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.35729            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62087            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62070            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62085            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp4     addr.port: *.61993            pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/MacOS/idea
proto: tcp46    addr.port: *.61992            pid: 70065    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.42329    pid: 70065    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.61983    pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.63342    pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.6942     pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.3075     pid: 67931    name:  /Applications/electerm.app/Contents/Frameworks/electerm Helper.app/Contents/MacOS/electerm Helper
proto: tcp6     addr.port: *.58640            pid: 320      name:  /usr/libexec/rapportd
proto: tcp4     addr.port: *.58640            pid: 320      name:  /usr/libexec/rapportd
proto: tcp4     addr.port: 127.0.0.1.9770     pid: 71       name:  /Applications/Pritunl.app/Contents/Resources/pritunl-service
kroolk
источник
Пожалуйста, не размещайте GIF-файлы терминала, вставьте сюда текст в формате кода. Это трудно скопировать, а также gard для чтения, если вам нужны большие шрифты
user151019
Изображение не GIF, это просто экран с выводом. Если вы нажмете, вы увидите, что это PNG. Размещено на imgur .. но это то, что StackExchange по умолчанию, я думаю. Во всяком случае, если вы ищете другой скриншот, я могу перехватить.
Кролк
ОК в моем комментарии заменить GIF на скриншот, не имеет значения, какой формат. Дело в том, что это должен быть текст
user151019
После удаления длинной команды из примера вывода теперь она будет работать лучше в качестве снимка экрана, поскольку с нее не нужно ничего копировать и она также может обрезаться лучше, чем раньше.
Mwfearnley