/ dev / tcp监听而不是nc监听


39

使用netcat侦听器,例如:

nc -l <port> < ~/.bashrc

我可以使用以下方法在新计算机(没有ncLDAP或没有LDAP)上获取.bashrc :

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

我的问题是:有没有一种方法可以nc -l <port>在我的第一行中使用/ dev / tcp而不是模仿它的功能nc

我正在使用的计算机是非常坚固的实验室/沙盒环境RHEL(没有ssh,没有nc,没有LDAP,没有yum,我无法安装新软件,并且它们没有连接到Internet)


缺少编写Python脚本来保持套接字打开的方法,有没有简单的方法可以做到这一点?
h3rrmiller 2012年

Answers:


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

@dezza,请参阅编辑。fd 3上的套接字确实没有关闭(尽管脚本终止时已经关闭)。我们需要关闭fd 4上的套接字,以便另一端获得EOF。
斯特凡Chazelas

42

不幸的是,仅仅用bash是不可能的。/dev/tcp/<ip>/<port>虚拟文件是通过bash尝试连接到指定的<ip>:<port>using connect(2)函数的方式实现的。为了创建监听套接字,必须调用bind(2)函数。

您可以通过下载bash源代码并查看它来进行检查。它lib/sh/netopen.c_netopen4功能(或_netopen6,也支持IPv6)的文件形式实现。该功能由netopen同一文件的包装器功能使用,而包装器功能又直接在文件redir.credir_special_open函数)中使用以实现此虚拟重定向。

您必须找到其他一些可以在计算机上创建监听套接字的应用程序。


bash +1允许创建客户端套接字,但是可以使用nc或可以用perl或c实现的服务器套接字,实际上服务器进程将循环接受连接和生成进程或创建线程,或者只能接受一个连接
Nahuel Fouilleul 2012年

2
@NahuelFouilleul:这并不完全正确。您可以使用所谓的“异步”或“事件驱动”网络编程(仅使用一个线程/进程来处理许多客户端)(尝试对select()函数进行谷歌搜索以及如何在网络编程中使用它)。在许多情况下,这是更好(更快)的接受大量客户的方式。
Krzysztof Adamski '10年

谢谢,我没有采用这种解决方案
Nahuel Fouilleul 2012年

4
这就是xinetd的目的。它进行监听,并为任何传入连接生成您的任意进程/脚本。有了它,任何东西都可以成为TCP / IP服务器。
Evi1M4chine

0

没有一种聆听的方法,因为聆听不是亚当斯基指出的那样。

但是,您无需在客户端上进行侦听,因此无需在客户端上使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.