Ao tentar ligar /dev/tcp/www.google.com/80
, digitando
/dev/tcp/www.google.com/80
Bash diz no such file or directory
. Ao olhar para o código de outras pessoas online, eles usam sintaxe como
3<>/dev/tcp/www.google.com/80
Percebi que isso também funciona:
</dev/tcp/www.google.com/80
Por que esses símbolos são necessários para chamar certas coisas no bash?
Porque esse é um recurso do shell (do ksh, copiado pelo bash) e apenas do shell.
/dev/tcp/...
não são arquivos reais, o shell intercepta as tentativas de redirecionamento para um/dev/tcp/...
arquivo e, em seguida, faz asocket(...);connect(...)
(faz uma conexão TCP) em vez deopen("/dev/tcp/..."...)
(abrindo esse arquivo) nesse caso.Note que tem que ser escrito assim.
cat < /dev/./tcp/...
ou///dev/tcp/...
não funcionará e tentará abrir esses arquivos (que na maioria dos sistemas não existem e você receberá um erro).A direção do redirecionamento também não importa. Se você usar
3< /dev/tcp/...
ou3> /dev/tcp/...
ou3<> /dev/tcp/...
ou mesmo3>> /dev/tcp/...
não fará nenhuma diferença, você poderá ler e gravar de/para esse descritor de arquivo para receber/enviar dados por esse soquete TCP.Quando você faz
cat /dev/tcp/...
, isso não funciona porquecat
não implementa esse mesmo tratamento especial, ele faz umopen("/dev/tcp/...")
like para todos os arquivos (exceto-
), apenas o shell (ksh, bash apenas) faz e apenas para o destino de redirecionamentos.Esse
cat -
é outro exemplo de um caminho de arquivo manipulado especialmente, desta vez, porcat
, não pelo shell.Em vez de fazer a
open("-")
e ler a entrada do descritor de arquivo resultante,cat
lê diretamente do descritor de arquivo 0 (stdin).cat
e muitos utilitários de texto fazem isso, o shell não para seus redirecionamentos. Para ler o conteúdo do-
arquivo, você precisacat ./-
de , oucat < -
(oucat - < -
). Em sistemas que não possuem/dev/stdin
,bash
no entanto, fará algo semelhante para redirecionamentos desse arquivo (virtual). O GNUawk
faz o mesmo para/dev/stdin
,/dev/stdout
,/dev/stderr
mesmo em sistemas que possuem esses arquivos, o que pode causar algumas surpresas em sistemas como o Linux, onde esses arquivos se comportam de maneira diferente.zsh
também tem suporte a soquete TCP (e fluxo de domínio Unix), mas isso é feito comztcp
(ezsocket
) embutidos, portanto, é menos limitado do que a abordagem ksh/bash. Em particular, ele também pode atuar como um servidor que o ksh/bash não pode fazer. Ainda é muito mais limitado do que o que você pode fazer em uma linguagem de programação real.Você parece estar confundindo as ideias ou lendo um arquivo e executando um comando. A diferença entre dados e instruções.
A primeira página do Google não é um programa executável. E se fosse, não seria seguro executá-lo.
Os caracteres de redirecionamento (incluindo
<
e>
), são usados para direcionar dados para um comando.Poderíamos fazer
cat < /dev/tcp/towel.blinkenlights.nl/23
No entanto, isso não funcionará/dev/tcp/www.google.com/80
, pois esta porta não responderá até que enviemosGET / HTTP/1.0\r\n\r\n
Então tente