====== nc ======
===== 概要 =====
* 正しくは Netcat コマンド
* TCP や UDP のパケットを読み書きするツール
* [[https://ja.wikipedia.org/wiki/Netcat | Netcat - Wikipedia]]
* 用途としては、対象ホストに対する疎通テストや、ファイル転送に用いる
* [[https://orebibou.com/2015/11/ncnetcat%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B98%E5%80%8B/ | nc(netcat)コマンドで覚えておきたい使い方8個 | 俺的備忘録 〜なんかいろいろ〜]]
* 一般的にファイルを転送するには、scp や sftp などを使うが、暗号化コストで転送速度が落ちてしまうので、純粋に転送速度を上げたい場合はこのコマンドを使うと良い (ただし、セキュリティは犠牲になるので、その点は注意して使うこと)
* 逆に単純な転送のみ行うため、パイプなどでさまざまな圧縮ツールなどを通すことができる
===== インストール =====
* Ubuntu では標準で入っている
===== ファイル転送 =====
==== シンプルな転送 ====
- サーバ (送信) 側とクライアント (受信) 側で ssh などでログインした状態にしておく
- 送受信
* 送信側\\ $ nc -l <ポート番号> < <送信ファイル>
* ''<ポート番号>'': [[http://e-words.jp/w/%E3%82%A6%E3%82%A7%E3%83%AB%E3%83%8E%E3%82%A6%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88.html | well-knownポート番号]] 以外のポート番号を指定 (10000 とかそれ以上の数字とか)
* 受信側\\ $ nc <ホスト名orIPアドレス> <ポート番号> > <保存パス>
* ''<ホスト名orIPアドレス>'': 送信側のホスト名か、IP アドレスを指定
* ''<ポート番号>'': 送信側と同じポート番号を指定
* ''<保存パス>'': 保存するファイルはリダイレクトで保存
- 転送が終了すると、何も表示せずにプロンプトに戻る
* 送信側で pv コマンドを使うと、転送の進捗もわかる
* pv コマンドのインストール\\ $ sudo apt-get install pv
* 送受信
* 送信側\\ $ pv <送信ファイル> | nc -l <ポート番号>
* 受信側は同じコマンド
* 参考サイト: [[http://blog.glidenote.com/blog/2014/12/02/using-netcat-for-file-transfers-with-pv/ | ncコマンドでファイル転送するときにpvコマンドで進捗を表示する - Glide Note]]
==== 高速な転送 ====
* ファイルを lzop や pigz などで圧縮すると転送速度が上がるらしい
* 参考サイト: [[http://ameblo.jp/principia-ca/entry-12023722731.html | 最速を究める! 2つのサーバ間で特盛りデータを30倍速で転送する方法|サイバーエージェント 公式エンジニアブログ]]
=== lzop を使う転送 ===
* 計算機に負荷 (CPU 負荷) をあまりかけずに高速に圧縮するなら、lzop を使うのが最適
* [[https://ja.wikipedia.org/wiki/Lzop | lzop - Wikipedia]]
* lzop のインストール\\ $ sudo apt-get install lzop
* 送受信
* 送信側\\ $ lsop -c <送信ファイル> | nc -l <ポート番号>
* pv コマンドを使う場合\\ $ pv <送信ファイル> | lzop -c | nc -l <ポート番号>
* 受信側\\ $ nc <ホスト名orIPアドレス> <ポート番号> | lsop -d > <保存パス>
=== pigz を使う転送 ===
* 計算機の CPU リソースが豊富でそれらを利用できるなら、gzip の並列版である pigz を使うのが最適
* [[http://qiita.com/itukizora/items/10a9e7fffff857de374b | マルチコアでgzファイルの圧縮解凍ができるpigzの使い方 - Qiita]]
* 送受信
* 送信側\\ $ pigz -c <送信ファイル> | nc -l <ポート番号>
* pv コマンドを使う場合\\ $ pv <送信ファイル> | pigz -c | nc -l <ポート番号>
* 受信側\\ $ nc <ホスト名orIPアドレス> <ポート番号> | pigz -d > <保存パス>
{{tag>Linux コマンド}}