Bash
/dev/tcp 聽而不是 nc 聽
使用 netcat 偵聽器,例如:
nc -l <port> < ~/.bashrc
我可以通過以下方式在新機器(沒有
nc
或沒有 LDAP)上獲取我的 .bashrc:cat < /dev/tcp/<ip>/<port> > ~/.bashrc
我的問題是:有沒有辦法
nc -l <port>
用 /dev/tcp 而不是模仿我第一行的功能nc
?我正在使用的機器是極其堅固的實驗室/沙盒環境 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 嘗試連接到指定的<ip>:<port>
usingconnect(2)
函式的方式實現。為了創建監聽套接字,它必須呼叫bind(2)
函式。您可以通過下載
bash
原始碼並查看它來檢查它。它在lib/sh/netopen.c
file in_netopen4
function(或_netopen6,也支持IPv6)中實現。該函式由netopen
來自同一文件的包裝函式使用,而包裝函式又直接在文件redir.c
(redir_special_open
函式)中使用以實現此虛擬重定向。您必須找到可以在您的機器上創建偵聽套接字的其他應用程序。