1. ホーム
  2. linux

[解決済み】Linuxでポートが開いているかどうかを効率的にテストする?

2022-04-11 13:35:42

質問

bash スクリプトから、ポートが 445 がサーバー上で開いている/聞いている。

いくつかのオプションを試しましたが、手っ取り早いものが欲しいのです。

1. lsof -i :445 (数秒かかります)

2. netstat -an |grep 445 |grep LISTEN (数秒かかります)

3. telnet (返送されません)

4. nmap , netcat はサーバーで利用できません。

最初に列挙して、その後にgrepするような方法を知っているといいのですが。

どのように解決するのですか?

最近知ったことですが、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

誰かがリッスンしているかどうかを判断するために、ループバックで接続を試みます。もし失敗したら、ポートが閉じられているか、アクセスを許可されていないことになる。その後、接続を終了する。

メールの送信、失敗時のスクリプトの終了、必要なサービスの起動など、使用するケースに応じて変更してください。