Есть ли какая-нибудь команда, которую я могу запустить из bash, которая скажет мне, открыт ли порт?
Используйте "netstat", чтобы проверить используемые в настоящее время порты.
netstat -antp Proto Recv-Q Локальный адрес Send-Q Внешний адрес Состояние PID/Имя программы tcp 0 0 xxx.xxx.xxx.xxx 0.0.0.0:* LISTEN 16297/named Tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297/named Tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0: * LISTEN 16297/named Tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 16297/named
Это (netstat) самое быстрое решение ...
netstat -lnt
... но это дает вам больше контроля (ценой скорости (иногда большой скорости)) ...
lsof -n -i -a -u www-data
В приведенном выше примере, например, показаны все порты TCP открытые и в состоянии LISTEN
, AND (-a
) принадлежащий апачу (www-data
) пользователь.
Все хорошие ответы.
Однако вы не упоминаете, вошли ли вы в систему на данном компьютере. ;П
Если нет, то nmap ваш друг.
для начала попробуйте:
nmap -O
target
amap также хороший выбор, который также попытается угадать программное обеспечение сервера, захватывая страницы баннеров.
для начала попробуйте:
amap
target
1-6000
Пытаться
lsof -i :<port number>
Если вы получаете какие-либо результаты, что-то слушает и связывает, например,
# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1833 nobody 3u IPv4 51091229 0t0 TCP odessa.cheney.net:http->79.173.188.214:52918 (ESTABLISHED)
nginx 1833 nobody 5u IPv4 46221856 0t0 TCP odessa.cheney.net:http->66.36.243.182:37876 (CLOSE_WAIT)
nginx 1833 nobody 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 1833 nobody 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
nginx 1833 nobody 14u IPv4 46221857 0t0 TCP odessa.cheney.net:http->66.36.243.182:37880 (CLOSE_WAIT)
nginx 1833 nobody 15u IPv4 51091030 0t0 TCP odessa.cheney.net:http->msnbot-65-55-106-132.search.msn.com:51708 (ESTABLISHED)
nginx 11832 root 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 11832 root 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
netstat -tlnp
Показать t
cp порты, которые l
istening, показать только n
umbers (не разрешать имена - делает это быстрее) и показать p
rocess, который выполняет прослушивание (p
работает только если вы root)
netstat -ulnp
Показать u
dp порты, которые l
istening, показать только n
umbers (не разрешать имена - делает это быстрее) и показать p
rocess, который выполняет прослушивание (p
работает только если вы root)
netstat -unp
Показать u
dp порты, которые открыты, но не прослушиваются, показать только n
umbers (не разрешать имена - делает это быстрее) и показать p
rocess, который выполняет прослушивание ( p
работает только если вы root)
netstat -an
Показывать a
ll используемые порты, показывать только n
umbers - не разрешать имена
lsof -i <proto>@<Host>:<port>
например
lsof -i [email protected]:25
чтобы узнать, прослушивает ли что-нибудь порт localhost 25/TCP, или
lsof -i [email protected]:636
чтобы увидеть, есть ли какие-либо сокеты, локальные или удаленные, либо прослушивающие (локальные), либо подключенные к (локальным или удаленным) для какого-либо хоста/интерфейса
lsof (список открытых файлов) - хороший инструмент для проверки, прослушивает ли процесс порт
lsof -P | grep: <номер порта>
netstat - это хороший инструмент для определения наличия активных соединений.
netstat -n | grep: <номер порта>
Я использую fuser (в пакете psmisc):
fuser -n tcp PORT
Возвращает pid процесса, связанного с этим портом.
Если нужно узнать, прослушивает ли порт, старый добрый telnet делает свое дело :)
пОРТ Telnet 127.0.0.1
Вы не упоминаете, какой протокол вы хотите использовать, то есть TCP или UDP), и также важно понимать, что "порт" не настолько гранулирован, что система поддерживает для устранения неоднозначности сокетов. Например, если ваша система имеет несколько IP-адресов, то порт 80 может использоваться на всех IP-адресах (либо приложение привязано к "0.0.0.0" или "::", либо к каждому IP-адресу подряд), либо оно может использоваться только на подмножестве этих IP-адресов.
Лучший и надежный способ определить, свободен и доступен ли порт/адрес, - попытаться привязать его. Netcat удобен для этого.
nc -l [-s a.b.c.d] -p NN
будет пытаться привязать к TCP порт NN включен (необязательно, по умолчанию будут все адреса) a.b.c.d. Добавьте параметр -u, чтобы сделать то же самое в UDP.
Далее, чтобы сказать, действительно ли порт "открыт", как вы просите, вам нужно начать искать потенциальные правила брандмауэра. Опять же, самое простое - попытаться подключиться к порту. Используйте netcat, как указано выше, на сервере и на клиенте используйте netcat, чтобы попытаться подключиться к открытому порту.
nc [-u] a.b.c.d NN
подключится к порту NN на .b.c.d, используя UDP, если указан флаг -u. Затем вы можете ввести ввод на стороне клиента, и он должен появиться на сервере. Если это не так, вам нужно изучить системные и сетевые инструменты.
Этот однострочник даст вам список всех используемых портов TCP). Он работает в bash на Ubuntu и OS X.
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
В списке будет один порт на линию без дополнительной информации.
Множество способов сделать это вызвало у меня проблемы, потому что они не работали на linux и osx, и/или потому что они не отображали порты, используемые docker, или процессы, которые принадлежали root. Теперь я просто использую эту программу JavaScript:
(убедитесь, что у вас установлен узел и что он работает с node
, а не только с nodejs
или измените программу соответствующим образом)
сохраните следующее в файл с именем check-port
на вашем пути или в вашем проекте
#!/usr/bin/env node
var http = require('http');
var app = new http.Server();
app.listen(process.argv[2], () => {
process.exit(0)
});
установить разрешения
chmod +x path/to/check-port
бежать с вашего пути
check-port 8080
или запустить из того же каталога
./check-port 8080
до сих пор это работает довольно хорошо.