Bash

/dev/tcp 聽而不是 nc 聽

  • September 7, 2020

使用 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.cfile in _netopen4function(或_netopen6,也支持IPv6)中實現。該函式由netopen來自同一文件的包裝函式使用,而包裝函式又直接在文件redir.credir_special_open函式)中使用以實現此虛擬重定向。

您必須找到可以在您的機器上創建偵聽套接字的其他應用程序。

引用自:https://unix.stackexchange.com/questions/49936