bash自体によって確立されたTCP接続を終了する方法は?


17

exec 3<>/dev/tcp/192.168.0.101/6435192.168.0.101:6435とのTCP接続を確立するために使用しました。そして、pipeコマンドとともにいくつかのメッセージを受信し、送信しました。

次に、TCP接続を終了します。しかし、ss -anpetbash自体が子プロセスをフォークすることなくこの接続を保持していることがわかります。

シグナル9と15をbashプロセスに送信しようとしましたが、ご存じのとおり、bashは自分自身を殺すことはできません。

それで、使用しているPTSを終了せずに、確立したTCP接続を終了できますか(ルートで殺すこともCtrl + Dを送信することもできません)?


別のシェルを入手してbash、そのシェルで殺すことができますか?
トリシス

3
bash確かに自分自身殺すことができます-それは実際にはここでやりたいことではありません!
psmears

@TJMは、この魅力的な質問を他の人にとってより便利なpipeものにするために、使用しているコマンドについて詳しく説明してもらえますか?どのパッケージpipeからのものですか?/dev/tcp/...接続を介してデータを送受信するために、どの(例)パラメーターを渡すことができますか?ありがとう。
アリエル

@arielf通常、私はコンピューターサイエンスの初心者であり、sedbotと呼ばれるbashシェルスクリプトからこのような使用法を見つけました。Githubで見つけることができます。はい、でファイルを/dev/tcp見つけることができません/dev/tcp。ただし、pipeこの種のファイルとデータを送受信できるのは特別な使用法のようです。/dev/tcp/ip/porttcp接続と/dev/udp/ip/portudpパッケージに使用すると言われています。私の英語はあまり上手ではないので、適切に説明する方法がわかりません。質問を編集して回答を投稿してください。
TJM

@TJMありがとう。質問はpipeあなたが言及したコマンドについてでした。私は見たhttps://github.com/clsr/sedbot/blob/master/sedbot.bashpipeコマンドはありません。これは、2つの関数を定義します:readmsgおよびsendmsgそれぞれ、接続との間で読み取り/書き込みを行います。readmsg用途IFS= read -r -u 3 -t "$READ_TIMEOUT" line変数にファイルディスクリプタ3から読み取るためのline、およびsendmsg用途echo "$(date +%s.%N) >>> $line" >&4とにかくファイルディスクリプタ4への書き込みには、これは完全な方法を明確にしています。「pipeコマンド」の言及は、読者にとって依然として謎のままです。
アリエル

回答:


18

そのコマンドは、ファイル記述子3で接続を開きました。したがって、接続を閉じるには、ファイル記述子3を閉じる必要があります。

exec 3<&-

1
これは適切なshutdown(3)呼び出しをclose(2)行いますか、それともファイル記述子のみですか?
ケビン

を行いますがcloseshutdown近いほど適切ではありません。shutdownの唯一の実際の用途は、二重ソケットの片側のみを閉じたい場合です。
パトリック

4
Aはshutdown一方で、FINを送信closeRSTを送信します。 これらは実質的に異なるものです。
ケビン

2
@Kevin RSTは、最初にすべてのデータを読み取らずにソケットを閉じることによって発生します。データの最後まで読んでからクローズを行うと、クローズはFINを送信します。
カスペルド

@kasperd:UNIXソケットAPIで、保留中のデータがあるかどうかを知る唯一の方法は、非ブロッキングソケットから読み取るか、またはのようなものを呼び出すことです。bash select()がどちらのオプションも提供するとは思わない
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.