nc listenの代わりに/ dev / tcp listen


39

次のようなnetcatリスナーを使用します。

nc -l <port> < ~/.bashrc

新しいマシンで.bashrcを取得できます(ncLDAP がありません)。

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

私の質問はnc -l <port>、私の最初の行の機能を/ dev / tcpの代わりに模倣する方法はありncますか?

私が取り組んでいるマシンは、非常に強化されたラボ/サンドボックス環境RHEL(ssh、nc、LDAP、yum、新しいソフトウェアをインストールできず、インターネットに接続されていません)


これを達成する簡単な方法はありますか?
h3rrmiller

回答:


23

Perlがインストールされている場合(RHELマシンにある場合):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

ローカルファイアウォールが1234への着信接続を許可しない限り、動作します。

socatがインストールされている場合:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

zshがインストールされている場合:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished

最後のztcp -c 4コマンドは3を読み取るべきではありませんか?それ以外の場合、素晴らしい情報、素晴らしいヒント。
デザ

@dezza、編集を参照してください。fd 3のソケットは実際には閉じられていませんでした(ただし、スクリプトが終了したときに閉じられていたはずです)。fd 4のソケットを閉じて、もう一方の端がEOFを取得する必要があります。
ステファンシャゼル16

42

残念ながら、bashだけではできません。/dev/tcp/<ip>/<port>仮想ファイルは、bashが指定された<ip>:<port>using connect(2)関数への接続を試みる方法で実装されます。リスニングソケットを作成するには、bind(2)関数を呼び出す必要があります。

これを確認するには、bashソースをダウンロードして確認します。関数内のlib/sh/netopen.cファイル_netopen4(またはIPv6もサポートする_netopen6)で実装されます。この関数はnetopen、同じファイルのラッパー関数によって使用され、この仮想リダイレクトを実装するためにファイルredir.credir_special_open関数)で直接使用されます。

マシン上で待機ソケットを作成できる他のアプリケーションを見つける必要があります。


+1は、bashがクライアントソケットを作成できるようにしますが、ncを使用できるサーバーソケット、またはperlまたはcで実装できます。実際、サーバープロセスは、接続の受け入れとプロセスの生成またはスレッドの作成をループします。
ナウエルフイユル

2
@NahuelFouilleul:それは完全に正しいわけではありません。いわゆる「非同期」または「イベント駆動型」のネットワークプログラミングを使用して、1つのスレッド/プロセスだけで多くのクライアントを処理できます(select()関数のグーグル検索とネットワークプログラミングでの使用方法を試してください)。多くの場合、それは多くのクライアントを受け入れるより良い(より速い)方法です。
クシシュトフアダムスキー

おかげで私は、このソリューションのかかわらなかった
ナウエルFouilleul

4
これがxinetdの目的です。リスニングを行い、着信接続用の任意のプロセス/スクリプトを生成します。これにより、何でもTCP / IPサーバーになります。
Evi1M4chine

0

Adamskiが指摘したように、聞くことはbashではないため、聞く方法はありません。

ただし、クライアントでリッスンする必要はないため、ファイルを転送するためにクライアントでnetcatを使用する必要はありません。次に例を示します。

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1

-3

あなたが言ったように、bashで/ dev / tcpに尋ねることができます:

</dev/tcp/host/port

すぐに実行する場合、リスニングしている、またはタイムアウトする


4
いいえ。あなたは間違いなくこれをテストしませんでした、そして、もしあなたが結果を理解してはいけません。あなたの提案は(リッスンではなく)ソケットを開き、実行したコマンドにリダイレクトします。正しい答えはすでに見つかっています(ほぼ6年前...)ので、なぜこの質問をネクロすることを選んだのかわかりません。
h3rrmiller
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.