次のようなnetcatリスナーの場合:
nc -l <port> < ~/.bashrc
新しいマシンで.bashrcを取得できます(nc
またはLDAPがない場合)。
cat < /dev/tcp/<ip>/<port> > ~/.bashrc
私の質問は、最初の行でnc
の代わりに/ dev/tcpを使用してnc -l <port>
の機能を模倣する方法はありますか?
私が作業しているマシンは、非常に強化されたラボ/サンドボックス環境のRHELです(ssh、nc、LDAP、yumなし、新しいソフトウェアをインストールできない、インターネットに接続されていない)
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
残念ながら、bashだけで行うことは不可能です。 _/dev/tcp/<ip>/<port>
_仮想ファイルは、bashがconnect(2)
関数を使用して指定された_<ip>:<port>
_に接続しようとする方法で実装されます。リスニングソケットを作成するには、bind(2)
関数を呼び出す必要があります。
これを確認するには、bash
ソースをダウンロードして確認します。 _lib/sh/netopen.c
_関数(または_netopen6、IPv6もサポート)の__netopen4
_ファイルに実装されています。この関数は、同じファイルのラッパー関数netopen
によって使用され、この仮想リダイレクトを実装するために、ファイル_redir.c
_(_redir_special_open
_関数)で直接使用されます。
あなたのマシン上でリスニングソケットを作成できる他のアプリケーションを見つける必要があります。
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