리디렉터를 통해 네트워크 트래픽 관리(/dev/tcp/host/port로 데이터 전송/수신)를 허용하는 Linux 셸은 무엇입니까?

리디렉터를 통해 네트워크 트래픽 관리(/dev/tcp/host/port로 데이터 전송/수신)를 허용하는 Linux 셸은 무엇입니까?

이것을 따르라배쉬 튜토리얼, 나는 성공적으로 다음의 코드를 얻었습니다.간단한 명령을 내리는 웹페이지이 방법을 사용하면 다음과 같습니다.

$ exec 3<>/dev/tcp/www.google.com/80
$ echo -e "GET / HTTP/1.1\n\n" >&3
$ cat <&3

사실 기본 Google HTML 사이트 코드는 다음과 같습니다.

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.es/?gfe_rd=cr&ei=HsiuVafkLpGt8weX7o-YAg
Content-Length: 258
Date: Tue, 21 Jul 2015 22:30:54 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic,p=0

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.es/?gfe_rd=cr&amp;ei=HsiuVafkLpGt8weX7o-YAg">here</A>.
</BODY></HTML>

이 트릭은 나에게 아주 효과적입니다. 예를 들어 매직 패킷(Wake on LAN)을 보내는 데 성공적으로 사용했습니다(예:).

어떤 쉘이 이것을 허용합니까?간단한 명령과 리디렉터를 사용하여 네트워크에 직접 데이터를 보내는 방법은 무엇입니까?
물론 Bash를 제외하고.

이 정보는 해당 시스템에 다음 기능이 있는지 이해하는 데 사용됩니다.

  • Linux가 내장된 라우터
  • 일반적인 Android 쉘.
  • iOS(iPhone/iPad) 케이스.
  • 일종의 Linux(NAS, Compulab's Utilite, Odroid...등)를 실행하는 기타 임베디드 장치.

답변1

ATT ksh93의 기능입니다.다음에 추가배쉬 2.04에서. 다른 일반적인 셸에서는 사용할 수 없습니다. 특히 dash 변형, pdksh 또는 mksh(2015년 7월 현재), BusyBox 또는 Android 변형, zsh 또는 Fish에서는 찾을 수 없습니다. Bash는 이 기능 없이 컴파일될 수 있습니다(참조:--enable-net-redirections), 따라서 bash가 있더라도 임베디드 장치에는 없을 수 있습니다.

기능이 있는지 테스트하려면 TCP 포트를 열려고 할 때 오류 메시지를 확인하면 됩니다.드롭 서비스:bash 및 ksh는 둘 다 "연결 거부됨"을 표시합니다(또는 로컬 시스템에 드롭 서비스가 있는 경우 명령이 즉시 반환됨). 이는 일부 네트워크 연결을 설정하지 않으면 볼 수 없습니다.

: </dev/tcp/127.0.0.1/9

이것이 일반적인 기능이 아닌 이유 중 하나는 많은 네트워크 프로토콜이 양방향 통신을 요구하고 누가 언제 대화하는지, 어떤 쉘이 이에 대해 덜 편리한지에 대한 신중한 처리를 요구하기 때문입니다. 또 다른 이유는 간단한 경우 파이프에 다음이 포함된다는 것입니다.인터넷 고양이,소캇또는소켓또한 작동합니다. 이러한 프로그램은 이진 데이터를 처리하며 서버 또는 클라이언트일 수 있습니다. Wake on LAN을 제외하고 간단한 방법으로 처리할 수 있는 대부분의 프로토콜에 대한 전용 도구가 있습니다.

echo -e "GET / HTTP/1.1\n\n" | nc www.google.com 80

echo -e "GET / HTTP/1.1\n\n" | socat - TCP:www.google.com:80

( socket입력이 끝날 때 쓰기를 위해 연결을 닫지 않기 때문에 실제로 HTTP 클라이언트로 작동하지 않습니다.)

스크립팅의 경우:

case $(export LANGUAGE=C LC_ALL=C; { : </dev/tcp/127.0.0.1/9; } 2>&1) in
  ""|*"Connection refused"*) echo "/dev/tcp is present";;
  *)
    if type nc >/dev/null 2>/dev/null; then
      echo "netcat is present"
    elif type socat >/dev/null 2>/dev/null; then
      echo "socat is present"
    else
      echo "I can't do TCP"
    fi
esac

1 Zsh는 UDP와 TCP 소켓을 다르게 사용합니다.

관련 정보