Linuxコマンド辞典 ncコマンド(ネットワーク)

サーバまたはクライアントとして起動し、データを送受信する「nc」コマンドの概要と使い方を記載しています。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

概要・使用方法

書式

$ nc [オプション] [ホスト名] [ポート番号]

TCP/UDPプロトコルを使ってネットワーク接続からデータを読み書きします。簡単な使い方は、接続先ホストとポート番号をオプションに指定してTCP接続を作ります。標準入力を相手ホストに送り、相手からの返事は標準出力に出力されます。これは接続が切るまで、もしくは自分で切断するまで継続します。またサーバやクライアントとしても起動でき、特定のポートを接続されるように待ち受けて、データを読み書きすることでサーバモードとして動作させることができます。

オプション

-4IPv4で利用する
-6IPv6で利用する
-U
–unixsock
UNIXドメインソケットで利用する
-c コマンド
–sh-exec コマンド
指定したコマンドを実行する
-e コマンド
–exec コマンド
入力を指定したコマンドにリダイレクトする
-o ファイル名
–output ファイル名
出力を指定したファイルに書き出す
-l
–listen
LISTENモード。待ち受けする
-x ファイル名
–hex-dump ファイル名
セッションデータを8進数でファイルに書き出す
-p ポート
–source-port ポート
ポート番号を指定する
-s アドレス
–source アドレス
ソースアドレスを指定する
-u
–udp
TCPの代わりにUDPを利用する
-w 秒数接続タイムアウトを指定した秒数で設定する
-zポートスキャンに利用する

HTTPクライアントとしてホストに接続する

$ nc IPアドレス or URL ポート番号

実行結果

[rin@centos ~]$ nc kcfran.com 443
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Date: Wed, 25 Jan 2023 02:19:55 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.14
Content-Length: 362
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
 Instead use the HTTPS scheme to access this URL, please.<br />
</p>
</body></html>

ポートスキャンして結果を出力する

$ nc -z -v IPアドレス or URL ポート番号 ポート番号開始-終了

サーバとクライアントでメッセージのやりとり

サーバー側

$ nc -l -p 待ち受けポート番号

クライアント側

$ echo "メッセージ" | nc IPアドレス or ホスト名 ポート番号

実行結果

[rin@centos ~]$ nc -l -p 2222
test    #<クライアント側から送った文字列が表示(2)
[rin@centos ~]$ 
[roi@centos ~]$ echo "test" | nc 192.168.0.60 2222 #<2:クライアント側から文字列をサーバに送信

サーバでポートを開けて、クライアントからのファイル転送を待つ

サーバー側

$ nc -l -p 待ち受けポート番号 > ファイルパス

クライアント側

$ nc サーバーのIPアドレス ポート番号 < ファイルパス

実行結果

[rin@centos tmp]$ nc -l -p 2222 > /tmp/test.txt    #サーバーとして2222/tcpに来たデータを/tmp/test.txtに書き込む(1)
[roi@centos ~]$ nc 192.168.0.60 2222 < ./test.txt  #ファイルをサーバに転送する(2)
[rin@centos tmp]$ ls test.txt                      #(2)で転送したファイルがあるかどうか確認
test.txt
[rin@centos tmp]$ 

クライアントから接続された時に指定したコマンドを実行する

サーバー側

$ nc -l -p 待ち受けポート番号 -c コマンド

クライアント側

$ nc サーバーのIPアドレス ポート番号

実行結果

[rin@centos tmp]$ nc -l -p 2222 -c uptime   #サーバは接続されたらuptimeコマンドを実行する
[roi@centos ~]$ nc 192.168.0.60 2222        #クライアントから接続する
 12:00:32 up 16 days,  9:11,  2 users,  load average: 0.00, 0.00, 0.00

クライアントからの入力を他のプログラムにリダイレクトする

ここではシェルにリダイレクトします。

サーバー側

$ nc -l -p 待ち受けポート番号 -e コマンド

クライアント側

$ nc サーバーのIPアドレス ポート番号

実行結果

[rin@centos tmp]$ nc -l -p 2222 -e /bin/sh  #サーバ側で実行。シェルにリダイレクトする
[roi@centos ~]$ nc 192.168.0.60 2222          #クライアント側で実行
hostname
centos
uname -a
Linux centos 4.18.0-372.32.1.el8_6.x86_64 #1 SMP Thu Oct 27 15:18:36 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux