Quais são os shells do Linux que permitem o gerenciamento do tráfego de rede (enviando / recebendo dados de / de '/ dev / tcp / host / port') via redirecionadores?

2

Seguindo este tutorial do Bash , consegui obter o código de uma página da Web que emite comandos simples usando este método:

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

De fato, recebo o código básico do site HTML do Google:

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>

Esse truque é fantástico para mim. Por exemplo, consegui usá-lo para enviar Magic Packets (Wake on LAN).

Então, fiquei me perguntando: quais shell permitem essa maneira de enviar dados diretamente para a rede usando comandos e redirecionadores simples?
Além do Bash, é claro.

Para que essa informação pode ser usada:

  • Sabendo se algum roteador (com Linux embarcado) teria esse recurso.
  • O mesmo para os shells comuns do Android.
  • O mesmo para shells do iOS (iPhone / iPad).
  • O mesmo acontece com outros dispositivos incorporados que executam algum tipo de Linux (NAS, Utilite da Compulab, Odroid ... etc).
por Sopalajo de Arrierez 22.07.2015 / 00:37

1 resposta

6

Este é um recurso do ATT ksh93 que foi adicionado no bash 2.04 . Nenhuma das outras shells comuns a possui, em particular você não a encontrará em nenhuma das variantes do traço, em pdksh ou mksh (a partir de julho de 2015), em qualquer das variantes BusyBox ou Android, ou em zsh¹ ou fish. O Bash pode ser compilado sem esse recurso (consulte --enable-net-redirections ), por isso pode estar ausente de dispositivos incorporados, mesmo que tenham bash.

Para testar se o recurso está presente, você pode verificar a mensagem de erro ao tentar abrir uma porta TCP para o serviço de descarte : tanto bash quanto ksh dizem "Connection refused" (ou o comando retorna imediatamente se você tiver um serviço de descarte em sua máquina local), o que você não veria se isso não tentasse fazer alguma conexão de rede.

: </dev/tcp/127.0.0.1/9

Um dos motivos pelos quais isso não é uma característica comum é que muitos protocolos de rede exigem comunicação bidirecional com o tratamento cuidadoso de quem fala quando, para os quais os shells não são muito convenientes. Outra razão é que, para os casos simples, tubos envolvendo netcat , socat ou socket também funcionam. Esses programas lidam com dados binários e podem ser servidores e clientes. A maioria dos protocolos que podem ser manipulados de maneira simples possui ferramentas especializadas, excetuando-se a LAN sem fio.

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 não funciona realmente como um cliente HTTP, pois não fecha a gravação da conexão no final da entrada).

Para scripts:

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

¹ O Zsh tem uma maneira diferente de usar soquetes UDP e TCP.

    
por 22.07.2015 / 02:18