Я хотел бы перечислить мои открытые сетевые порты в Терминале со встроенными командами. Насколько я знаю, netstat
это команда для использования. Но я изо всех сил пытаюсь получить какую-либо полезную информацию из него.
Как я могу перечислить свои открытые порты с помощью netstat
? Любые конкретные флаги, которые помогают мне в этом случае?
netstat -anvp tcp | awk 'NR<3 || /LISTEN/'
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state) rhiwat shiwat pid epid state options
tcp46 0 0 *.62981 *.* LISTEN 131072 131072 34548 0 0x0100 0x00000006
…
sudo lsof -PiTCP -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
BetterTou 34548 grgarside 20u IPv4 0xa42a1d0ade5d3585 0t0 TCP *:62981 (LISTEN)
BetterTou 34548 grgarside 21u IPv6 0xa42a1d0ad67f7a5d 0t0 TCP *:62981 (LISTEN)
…
возможно, вы можете использовать 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)
lsof
перечисляет открытые файлы. Сетевые сокеты считаются файлами, поэтому каждый открытый сетевой сокет (слушающий или активно используемый) будет указан в файле lsof
.Во-первых, я не эксперт 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
Самый простой метод заключается в использовании 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.
nmap
, чтобы понять, почему я считаю важным видеть, что действительно открыто, а не просто пассивные порты, ожидающие соединения.Основываясь на отличном ответе @kroolk, я бы предложил этот однострочник:
netstat -Watnlv | grep LISTEN | awk '{"ps -ww -o args= -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 "|"
... который не будет обрезать вывод ps
(по крайней мере, на моем Mac) и даст полную команду, включая аргументы :-)
микроб
lsof
liner прекрасен, поскольку он также раскрывает метаданные процесса и пользователя и может выполняться безsudo
сужения области действия.