Qual sistema semelhante ao Unix realmente fornece o arquivo especial / dev / tcp?

9

Eu sei que /dev/tcp/<host>/<port>é um caminho mágico tratado especificamente por algumas conchas nos redirecionamentos. Mas de acordo com man bash:

Se o sistema operacional no qual o bash estiver em execução fornecer esses arquivos especiais, o bash os utilizará; caso contrário, ele será copiado internamente [...]

Na caixa do Linux que estou usando agora, o /dev/tcparquivo especial não está presente; portanto, o Bash o emulará . Mas, na verdade, existe um sistema semelhante ao Unix que fornece ao /dev/tcparquivo especial a mesma semântica que a suportada pelo Bash?

Sylvain Leroux
fonte
Isso exigiria um diretório emulado. Criar diretórios emulados é possível apenas com sistemas de arquivos específicos, por exemplo, procfs ou sysfs podem fazer isso. /devé um tmpfs nos linuxes atuais e estava na partição raiz nos mais antigos. É por isso que é impossível atualmente. Poderia ser possível facilmente com uma extensão sysfs ou procfs (ambos os fs são muito flexíveis e semelhantes (na verdade, provavelmente ninguém sabe por que eles não são os mesmos)), ninguém faz isso hoje, mas pode ser feito em cerca de 100 linhas de código.
peterh - Restabelece Monica 14/01/19
Mas já existe outro sistema operacional? Em algum momento, pensei que o Plano 9 fizesse isso, mas estava errado.
Sylvain Leroux
1
Eu não sei, provavelmente não (até onde eu sei, é uma invenção do bash). Votei sua pergunta, porque a resposta também é interessante para mim. Até onde eu sei, nenhum SO unix popular com capacidade para x86 pode fazer isso.
peterh - Restabelece Monica

Respostas:

8

Eu acho que a documentação do Bash é um pouco enganadora sobre esse tópico. Observando o código, até voltando à versão 2.04, onde os redirecionamentos de rede foram introduzidos, /dev/tcpe /dev/udpfunciona da seguinte maneira:

  • no momento da criação, o configurescript verifica se há suporte para vários recursos de rede; se assim for, se os redirecionamentos de rede estiverem ativados (que é o caso por padrão), o código de rede interno é incorporado;
  • em tempo de execução, se o código de rede interno estiver incorporado /dev/tcpe /dev/udp(no formato correto) for tratado internamente; caso contrário, um aviso será produzido (“/ dev / (tcp | udp) / host / porta não suportado sem rede”) e o Bash tenta abrir o caminho especificado no sistema;
  • se os redirecionamentos de rede estiverem configurados, nada de especial será feito.

O que isso se resume é:

  • se o redirecionamento de rede estiver ativado:
    • se a rede é suportada na plataforma de destino /dev/tcpe /dev/udpsempre será tratada internamente;
    • caso contrário, o Bash avisará e tentará abrir o arquivo “às cegas”; se o sistema de alguma forma suportar /dev/(tcp|udp)/host/port, isso será usado; caso contrário, com toda a probabilidade, o redirecionamento falhará;
  • se o redirecionamento de rede estiver desativado, nenhum tratamento especial será executado; como acima, se o sistema de alguma forma suportar /dev/(tcp|udp)/host/port, isso será usado; caso contrário, com toda a probabilidade, o redirecionamento falhará.

/dev/tcpexiste em alguns sistemas, mas até onde eu sei, nenhum suporta a mesma abstração que o Bash. No Solaris, /dev/tcpé usado com a nddferramenta para consultar e alterar a configuração da rede. No XTI (consulte também o Open Group, se você for um membro), a t_openfunção pode ser usada /dev/tcppara abrir uma conexão TCP, mas não usa a configuração baseada em caminhos, existe uma estrutura de dados separada para especificar o host de destino e porta (e outros parâmetros).

Stephen Kitt
fonte
O próprio recurso vem do ksh93. / dev / tcp em sistemas SysV seria um identificador no módulo STREAMS tcp.
Stéphane Chazelas