LinuxでBashのソケットからデータを読み取る方法
公開: 2022-06-28Linuxコマンドラインを使用すると、ソケットをリッスンするか、ソケットに接続することでデータを取得できます。 データはテキストファイルに取り込むことができます。 その方法をお見せします。
ソケットクライアントとサーバー
ソケットにより、ネットワーク化されたソフトウェアが通信できるようになります。 これらは、1983年にカリフォルニア大学バークレー校で作成された4.2BSD Unixオペレーティングシステムで最初に実装されました。これらは、SystemVUnixおよびMicrosoftWindowsですぐに採用されました。
ソケットはソフトウェアネットワーク接続のエンドポイントであり、ファイルハンドルとして扱うことができるように抽象化されています。 これは、「すべてがファイルである」という一般的なUnixおよびLinuxの設計原則に適合していることを意味します。 ネットワークケーブルを差し込む壁の物理的なソケットを意味するものではありません。
プログラムが別のソフトウェアのソケットに接続する場合、そのプログラムは他のソフトウェアのクライアントであると見なされます。 他のソフトウェアが接続を要求できるようにするソフトウェアは、サーバーと呼ばれます。 これらの用語は、ITの世界におけるクライアントおよびサーバーの他の用途とは独立して使用されます。 混乱を避けるために、あいまいさを取り除くためにソケットクライアントおよびソケットサーバーと呼ばれることもあります。 それらをクライアントおよびサーバーと呼びます。
ソケットはアプリケーションプログラミングインターフェイス(API)として実装されているため、ソフトウェア開発者はコード内からソケット機能を呼び出すことができます。 あなたがプログラマーならそれでいいのですが、そうでないならどうしますか? または、おそらくあなたはそうですが、あなたのユースケースはアプリケーションを書くことを保証しませんか? Linuxは、必要に応じて、他のソケット対応プロセスからデータを取得または受信するために、基本的なソケットサーバーとソケットクライアントを使用できるコマンドラインツールを提供します。
関連: APIとは何ですか、開発者はそれらをどのように使用しますか?
人間関係は決して簡単ではありません
使用するプログラムはnc
とncat
です。 これら2つのユーティリティには奇妙な関係があります。 nc
プログラムは、 nc
よりはるかに古いncat
を書き直したものです。 しかし、 ncat
も書き直されており、 nc
ではできないことを実行できるようになりました。 そして、それ自体がnetcat
と呼ばれるツールの派生物であるncat
の多くの実装があります。 その上、ほとんどのディストリビューションでは、 nc
はncat
へのシンボリックリンクであり、個別のプログラムではありません。
最近のArch、Manjaro、Fedora、Ubuntuのディストリビューションをチェックしました。 ツールのインストールが必要なのはManjaroだけでした。 Manjaroでは、 nc
を取得するためにnetcat
パッケージをインストールする必要がありますが、 ncat
を取得せず、 netcat
を取得します。 そしてManjaroでは、 nc
はnetcat
へのシンボリックリンクです。
sudo pacman -S netcat
肝心なのは、この記事の例でncat
が表示された場合、Manjaroではnetcat
を使用することです。
ソケットで聞く
ソフトウェアが着信ソケット接続をリッスンする場合、それはサーバーとして機能しています。 ソケット接続を介して送信されるデータはすべて、サーバーによって受信されたと言われます。 nc
を使用すると、この動作を非常に簡単に再現できます。 受信したデータはすべてターミナルウィンドウに表示されます。
-l
(listen)オプションを使用して、接続をリッスンするようにnc
に指示する必要があります。また、接続をリッスンするポートを指定する必要があります。 このnc
のインスタンスに接続しようとするクライアントプログラムまたはプロセスは、同じポートを使用する必要があります。 -p
(ポート)オプションを使用して、リッスンするポートをnc
に指示します。
このコマンドは、 nc
をソケットサーバーとして起動し、ポート6566で接続をリッスンします。
nc -l -p 6566
着信接続を待機している間、 nc
は出力を生成しません。 接続が確立されると、取得した情報がターミナルウィンドウに表示されます。 ここでは、「クライアント1」として自分自身を識別しているクライアントプログラムによって接続が確立されています。
nc
によって表示されるすべては、クライアントから受信されます。 このクライアントは、たまたまその名前と、時刻と日付を含む番号付きメッセージを送信します。
クライアントが接続を切断すると、 nc
が終了し、ターミナルプロンプトに戻ります。
ファイルへのデータの送信
クライアントからのデータをファイルにキャプチャするために、リダイレクトを使用してnc
からファイルに出力を送信できます。 このコマンドは、受信したデータを「logfile.txt」というファイルに保存します。
nc -l -p 6566> logfile.txt
出力は表示されず、ファイルに入ります。逆説的に、 nc
が終了するまで、接続が発生したかどうかはわかりません。 コマンドプロンプトに戻ることは、接続が発生し、クライアントによって終了されたことを示します。
「logfile.txt」ファイルの内容を確認するために、 less
を使用できます。
少ないlogile.txt
次に、データをスクロールして、lessの組み込み関数を使用して検索できます。
関連: Linuxでlessコマンドを使用する方法
ファイルとターミナルウィンドウへのデータの送信
ターミナルウィンドウでデータのスクロールを確認し、同時にファイルに送信する場合は、 nc
からの出力をtee
にパイプします。
nc -l -p 6566 | tee logfile.txt
複数の接続を受け入れる
それはすべて問題ありませんが、制限があります。 1つの接続のみを受け入れることができます。 単一のクライアントからのデータの受信に制限されています。 また、そのクライアントが接続を切断すると、ソケットサーバーnc
が終了します。
複数の接続を受け入れる必要がある場合は、 ncat
を使用する必要があります。 nc
で行ったように、 ncat
にリッスンし、特定のポートを使用するように指示する必要があります。 ただし、 -k
(存続)オプションも使用します。 これにより、 ncat
は、最後のアクティブな接続が切断された場合でも、クライアントからの接続を実行および受け入れ続けるように指示されます。
これは、「Ctrl-C」で終了することを選択するまで、 ncat
が実行されることを意味します。 ncat
が現在クライアントに接続されているかどうかに関係なく、新しい接続が受け入れられます。
ncat -k -l -p 6566
接続時にncat
からの出力に表示されるさまざまなクライアントからのデータを確認できます。
サーバーへの接続
nc
をソケットクライアントとして使用し、接続を受け入れてサーバーとして機能している別のプログラムに接続することもできます。 このシナリオでは、 nc
がソケットクライアントです。 これを行うには、サーバーソフトウェアがネットワーク上のどこにあるかをnc
に通知する必要があります。
これを行う1つの方法は、IPアドレスとポート番号を提供することです。 サーバーがnc
を実行しているのと同じPC上にある場合は、127.0.0.1のループバックIPアドレスを使用できます。 サーバーアドレスとポート番号を示すために使用されるフラグがないわけではありません。 適切な値を提供するだけです。
同じPC上のサーバーに接続し、ポート6566を使用するには、ループバックIPアドレスを使用できます。 使用するコマンドは次のとおりです。
nc 127.0.0.1 6566
nc
がサーバーから取得するデータは、ターミナルウィンドウでスクロールします。
サーバーソフトウェアを実行しているコンピューターのネットワーク名がわかっている場合は、IPアドレスの代わりにそれを使用できます。
nc sulaco 6566
「Ctrl+C」を使用して接続を切断します。
早くて簡単
nc
とncat
は、カスタムソケットハンドラーを作成したくないが、ソケット対応のソースからデータを収集する必要がある場合に適しています。 出力をファイルにリダイレクトすると、 less
を使用して出力を確認し、 grep
などのユーティリティを使用してファイルを解析できます。
関連: Linuxでgrepコマンドを使用する方法