O / dev / {udp, tcp} é padronizado ou está disponível em qualquer lugar?

17

Eu aprendi recentemente sobre o /dev/udpe /dev/tcppseudo-dispositivos aqui . Eles são específicos para algumas distribuições GNU / Linux ou posso encontrá-los em outros sistemas unix?

Eles são padronizados de alguma forma?

Até agora, consegui usá-los com sucesso no OS X, Arch Linux e CentOS.

Antoine
fonte

Respostas:

26

Esse é um recurso do shell e não do sistema operacional.

Então, por exemplo, no Solaris 10 com ksh88o shell:

% cat < /dev/tcp/localhost/22
ksh: /dev/tcp/localhost/22: cannot open

No entanto, se mudarmos para bash:

% bash
bash-3.2$ cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_1.1.5

Então bashinterpreta o /dev/tcpmas ksh88 não.

No Solaris 11 com ksh93o shell:

% cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_2.2

Então, podemos ver que é muito dependente do shell em uso.

Stephen Harris
fonte
4
Também depende das opções em tempo de compilação - nem todas as compilações do bash o habilitarão.
Charles Duffy
@CharlesDuffy Verdadeiro o suficiente; o mesmo acontece com o ksh (o ksh-88 tentou detectar automaticamente, mas não tenho certeza se funcionou corretamente).
Stephen Harris
1
Em relação à primeira frase, o POSIX padroniza alguns recursos básicos do shell (embora /dev/tcp/...não seja um deles).
precisa saber é o seguinte
3

Para adicionar, no nó Informações da festança :

O Bash lida com vários nomes de arquivos, especialmente quando eles são usados ​​em redirecionamentos, conforme descrito na tabela a seguir. Se o sistema operacional no qual o Bash está executando fornecer esses arquivos especiais, o bash os usará; caso contrário, os emulará internamente com o comportamento descrito abaixo.

'/ dev / fd / FD' Se FD for um número inteiro válido, o descritor de arquivo FD será duplicado.

'/ dev / stdin' O descritor de arquivo 0 está duplicado.

'/ dev / stdout' O descritor de arquivo 1 está duplicado.

'/ dev / stderr' O descritor de arquivo 2 está duplicado.

'/ dev / tcp / HOST / PORT' Se HOST for um nome de host ou endereço da Internet válido e PORT for um número de porta inteiro ou nome de serviço, o Bash tentará abrir o soquete TCP correspondente.

'/ dev / udp / HOST / PORT' Se HOST for um nome de host ou endereço da Internet válido e PORT for um número de porta inteiro ou nome de serviço, o Bash tentará abrir o soquete UDP correspondente.

extremeaxe5
fonte