web-dev-qa-db-ja.com

Linux上でポートが開いているかどうかを効率的にテストしますか?

Bashスクリプトから、ポート445がサーバー上で開いているかリスニングしているかどうかをすばやく確認するにはどうすればよいですか。

私はいくつかのオプションを試してみましたが、私はすぐに何かが欲しいです:
1。 lsof -i :445(数秒かかります)
2。 netstat -an |grep 445 |grep LISTEN(数秒かかります)
3。 telnet(それは返さない)
4。 nmapnetcatはサーバー上で利用できません

最初に列挙しないで、その後にうまくいく方法を知っているのはいいことです。

186
Aman Jain

私が最近見つけた驚きは、Bashがネイティブに tcp接続をファイル記述子としてサポートしていることです 。使用するには:

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

0、1、2はstdin、stdout、およびstderrであるため、ファイル記述子として6を使用しています。 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

誰かが聞いているかどうかを判断するには、ループバックで接続を試みます。失敗した場合、ポートは閉じられているか、アクセスが許可されていません。その後、接続を閉じます。

電子メールの送信、失敗した場合のスクリプトの終了、必要なサービスの開始など、ユースケースに合わせてこれを変更します。

151
Spencer Rathbun

ここに「速い答え」と非常に短いがあります: リモートTCPポートがシェルスクリプトから開かれているかどうかテストする方法?

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

私は127.0.0.1でそれを「リモート」アドレスとして使用します。

100
user2187128

あなたはずっと速い結果のためにこのようにnetstatを使うことができます:

Linuxの場合:

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

Macの場合:

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

これはポート(この例では445)で待機しているプロセスのリストを出力するか、またはポートが空いていれば何も出力しません。

89
anubhava

これにはnetcatを使うことができます。

nc ip port < /dev/null

サーバーに接続し、直接接続を再度閉じます。 netcatが接続できない場合は、ゼロ以外の終了コードを返します。終了コードは変数$?に格納されています。例として、

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

netcatがポートに正常に接続できた場合に限り、0を返します。

36
Tony

それらは/ proc/net/tcpにリストされています。

これは、 ":"の後の16進数で2番目の列です。

> 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  

だから私は3列目のそれらの:50の一つがstackoverflowでなければならないと思います:o)

詳しくはman 5 procを見てください。そしてそれをsedなどで区別することは、優しい読者のための練習として残されています...

15
andrew cooke

Bashを使ったSpencer Rathbunの答えに基づく:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
13
user1338062
ss -tl4 '( sport = :22 )'

2msは十分速いですか?

コロンを追加すればこれはLinux上で動きます

11
leucos

私たちのLinuxテストサーバーの1つでポートが開いているかどうかをチェックしたいと思いました。私は自分の開発マシンからテストサーバーにtelnetで接続しようとすることによってそれをすることができました。あなたの開発マシン上で実行しようとします。

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

この例では、ポート 8080 がホスト test2.Host.comで開いているかどうかを確認します

5
razvang
nc -l 8000

8000はポート番号です。ポートが空いている場合は、簡単に閉じることができるサーバーが起動されます。そうでない場合はエラーになります。

nc: Address already in use
5
Jose Enrique

これは、MacとLinuxの両方で機能するものです。

netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'
5
Artur Bodera

tcping はオーバーヘッドが非常に少ない優れたツールです。また、迅速にするためのタイムアウト引数もあります。

[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.
1
Payam

Netcatコマンドも使えます

[location of netcat]/netcat -zv [ip] [port]

または

nc -zv [ip] [port]

-z - 実際にデータを送信せずに、単にリスニングデーモンをスキャンするようにncを設定します。
- v - 冗長モードを有効にします。

0
Saurabh