stdinとstdoutをポートにリダイレクトする


10

Pから読み取りstdinと書き込みを行うプログラムを使用したいのですが、特定のポートから読み取って別のポートに出力するようなプログラムにstdout接続しncます。

# The reading is easy, here P reads from port 50505
nc -l 50505 | P

ポート60606と書き戻すにはどうすればよいですか?


述べたようにあなたの質問は不明瞭です。誰かがマシンに2つのTCP接続を開き、1つはポート50505に、もう1つはポート50506に開いて、最初の1つにデータを送信して、2つ目のTCP接続からのP出力を読み取って予期する必要があるということPですか?なぜUDPタグなのですか?
ステファンChazelas

はい!までUDPは欲しかったと思いますportsが、それは既存のキーワードではなかったのでTCP、と思いUDP、反射から追加したと思います。
Yimin Rong

回答:


12

つまり、誰かがあなたのマシンに2つのTCP接続を開いて、1つはポート50505に、もう1つはポート60606に、最初のPにデータを送信して、Pにフィードし、2番目のTCP接続からPの出力を読み取ることを期待しているということです。それは次のようになります:

< /dev/null nc -q -1 -l 50505 | P | nc -l 60606 > /dev/null

またはsocat

socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr

P出力を同じ接続に戻すには:

socat tcp-listen:50505,reuseaddr exec:P

3

ncポートを操作するために必要はありません。bashそれ自体を行うことができます:

Bashは、次の表に示すように、いくつかのファイル名をリダイレクトで使用する場合に特別に処理します。

/dev/fd/fd
    If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
    File descriptor 0 is duplicated.
/dev/stdout
    File descriptor 1 is duplicated.
/dev/stderr
    File descriptor 2 is duplicated.
/dev/tcp/host/port
   If host is a valid hostname or Internet address, and port is an integer 
   port number or service name, bash attempts to open a TCP connection to
   the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer 
    port number or service name, bash attempts to open a UDP connection to
    the corresponding socket.

3
/dev/tcp多くの場合無効になっており、リスニングには使用できません。zshリスニングtcpソケットを作成できるシェルが必要な場合に必要です。
ステファンChazelas

@StéphaneChazelas私は私が試したことがないと認めざるを得ません。manページのこの制限については何も言われていませんか?
Hauke Laging 2014年

さて、どうしますか?リスナーソケットは、より多くの受け入れソケットを作成するためのドアであり、リダイレクトはそのためには機能しません。zshはそのために組み込みを使用します(ztcp -lリスニングおよび ztcp -aリスニングソケットでの接続を受け入れるため)。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.