nc listen 대신 / dev / tcp listen


39

다음과 같은 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 없음, 새 소프트웨어를 설치할 수 없으며 인터넷에 연결되어 있지 않습니다)


소켓을 열어두기 위해 파이썬 스크립트를 작성하는 것이 부족한 경우 이것을 달성하는 쉬운 방법이 있습니까?
h3rrmiller 18시 59 분

답변:


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를 얻습니다.
Stéphane Chazelas

42

불행히도 bash만으로는 불가능합니다. /dev/tcp/<ip>/<port>가상 파일은 bash가 지정된 <ip>:<port>using connect(2)함수 에 연결을 시도하는 방식으로 구현됩니다 . 청취 소켓을 만들려면 bind(2)함수 를 호출해야 합니다.

bash소스 를 다운로드 하여보고이를 확인할 수 있습니다 . lib/sh/netopen.c파일 _netopen4기능 (또는 IPv6도 지원하는 _netopen6 )으로 구현됩니다 . 이 기능은 netopen동일한 파일의 랩퍼 기능 에서 사용되며이 가상 리디렉션을 구현하기 위해 파일 redir.c( redir_special_open함수) 에서 직접 사용 됩니다.

컴퓨터에서 청취 소켓을 만들 수있는 다른 응용 프로그램을 찾아야합니다.


+1 bash는 클라이언트 소켓을 만들 수 있지만 nc를 사용할 수 있거나 perl 또는 c로 구현할 수있는 서버 소켓은 실제로 서버 프로세스가 연결 수락 및 생성 프로세스를 반복하거나 스레드를 만들거나 하나의 연결 만 수락 할 수 있습니다.
Nahuel Fouilleul

2
@NahuelFouilleul : 그것은 완전히 정확하지 않습니다. 소위 "비동기"또는 "이벤트 주도"네트워크 프로그래밍 (select () 함수에 대한 인터넷 검색 및 네트워크 프로그래밍에서 사용되는 방법)을 사용하여 하나의 스레드 / 프로세스로 많은 클라이언트를 처리 할 수 ​​있습니다. 많은 경우에 많은 고객을 받아들이는 것이 훨씬 빠릅니다.
Krzysztof Adamski

감사합니다.이 솔루션은 없었습니다
Nahuel 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.