Эффективно проверить, открыт ли порт в Linux (без nmap или netcat)



из скрипта bash как я могу быстро узнать, есть ли порт 445 открыто / прослушивание на сервере.



Я пробовал несколько вариантов, но я хочу что-то быстро:

1. lsof -i :445 (занимает несколько секунд)

2. netstat -an |grep 445 |grep LISTEN (занимает несколько секунд)

3. telnet (он не возвращается)

4. nmap,netcat недоступны на сервере



будет приятно узнать о способе, который не перечисляет сначала и greps после этого.

769   13  

13 ответов:

сюрприз, который я узнал недавно, заключается в том, что Bash изначально поддерживает tcp соединения как дескрипторы файлов. Для использования:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

Я использую 6 в качестве дескриптора файла, потому что 0,1,2-это stdin, stdout и stderr. 5 иногда используется Bash для дочерних процессов, поэтому 3,4,6,7,8 и 9 должны быть безопасными.

согласно комментарию ниже, чтобы проверить для прослушивания на локальный сервер в скрипт:

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

определить, если кто-то слушает, пытается подключиться по петле. Если это не удается, то порт закрыт или не разрешен доступ. После этого закройте соединение.

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

здесь очень короткий с "быстрым ответом":Как проверить, открыт ли удаленный TCP-порт из сценария оболочки?

$ nc -z <host> <port>; echo $?

Я использую его с 127.0.0.1 в качестве "удаленного" адрес.

вы можете использовать netstat таким образом для гораздо более быстрых результатов:

На Linux:

netstat -lnt | awk ' == "LISTEN" &&  ~ /\.445$/'

На Mac:

netstat -anp tcp | awk ' == "LISTEN" &&  ~ /\.445$/'

это выведет список процессов, прослушивающих порт (445 в данном примере), или он ничего не выведет, если порт свободен.

Вы можете использовать netcat для этого.

nc ip port < /dev/null

подключается к серверу и сразу закрывает соединение снова. Если netcat не может подключиться, он возвращает ненулевой код выхода. Код выхода хранится в переменной $?. В качестве примера,

nc ip port < /dev/null; echo $?

вернет 0, если и только если netcat может успешно подключиться к порту.

они перечислены в /proc/net/tcp.

Это второй столбец, после":", в шестнадцатеричном формате:

> cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 10863 1 ffff88020c785400 99 0 0 10 -1                     
   1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1                      
   2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000  1000        0 10562454 2 ffff88010040f7c0 22 3 30 5 3                   
   3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000  1000        0 10701021 2 ffff880100474080 41 3 22 10 -1                 
   4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000  1000        0 10700849 2 ffff880104335440 57 3 18 10 -1                 
   5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000  1000        0 10698952 2 ffff88010040e440 46 3 0 10 -1                  
   6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000  1000        0 9562907 2 ffff880104334740 22 3 30 5 4                    
   7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000  1000        0 10696677 2 ffff880106cc77c0 45 3 0 10 -1  

Так что я думаю, один из тех :50 в третьем столбце должен быть stackoverflow: o)

посмотреть в man 5 proc для более подробной информации. и выбор этого отдельно с sed и т. д. остается в качестве упражнения для нежного читателя...

ss -tl4 '( sport = :22 )'

2ms достаточно быстро ?

добавить двоеточие и это работает на Linux

на основе ответа Спенсера Ратбуна, используя bash:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
nc -l 8000

где 8000-номер порта. Если порт свободен, он запустит сервер, который вы можете легко закрыть. Если это не так, он выдаст ошибку:

nc: Address already in use

Я хотел проверить, открыт ли порт на одном из наших тестовых серверов linux. Я смог сделать это, пытаясь подключиться к telnet с моей машины dev на тестовый сервер. На вашей машине dev попробуйте запустить:

$ telnet test2.host.com 8080
Trying 05.066.137.184...
Connected to test2.host.com

в этом примере я хочу проверить, если порт 8080 открыт на хосте test2.host.com

вот тот, который работает как для Mac, так и для Linux:

netstat -aln | awk ' == "LISTEN" &&  ~ "[\.\:]445$"'

tcping Это отличный инструмент с очень низким overhead.It также есть аргумент тайм-аута, чтобы сделать его быстрее:

[root@centos_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[root@centos_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[root@centos_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.

nmap - Это правильный инструмент. Просто используйте nmap example.com -p 80

вы можете использовать его с локального или удаленного сервера. Это также поможет вам определить, если брандмауэр блокирует доступ.

Если вы используете iptables попробовать:

iptables -nL

или

iptables -nL | grep 445

Comments

    Ничего не найдено.