/ dev / tcp listen em vez de nc listen

39

Com um ouvinte netcat como:

nc -l <port> < ~/.bashrc

Posso pegar meu .bashrc em uma nova máquina (não possui ncou LDAP) com:

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

Minha pergunta é: Existe uma maneira de imitar os recursos da nc -l <port>minha primeira linha com / dev / tcp em vez de nc?

As máquinas nas quais estou trabalhando são RHEL extremamente endurecidas (sem ssh, nc, LDAP, yum, não consigo instalar novos softwares e eles não estão conectados à Internet)

h3rrmiller
fonte
Antes de escrever um script python para manter o soquete aberto, existe uma maneira fácil de fazer isso?
H3rrmiller 4/10/12
relacionada stackoverflow.com/questions/4739196/...
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

23

Se o Perl estiver instalado (como em uma máquina RHEL):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

funcionaria, a menos que um firewall local não permita conexões de entrada para 1234.

Se o socat estiver instalado:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

Se o zsh estiver instalado:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished
Stéphane Chazelas
fonte
O último ztcp -c 4comando não deveria ler 3? Caso contrário, ótimas informações, ótima dica.
Dez17
@dezza, veja editar. O soquete no fd 3 não estava sendo fechado de fato (embora estivesse quando o script terminasse). Precisamos fechar o soquete no fd 4 para que a outra extremidade obtenha um EOF.
Stéphane Chazelas
42

Infelizmente, é impossível fazer apenas com o bash. /dev/tcp/<ip>/<port>arquivos virtuais são implementados da maneira que o bash tenta se conectar à função especificada <ip>:<port>usando connect(2). Para criar um soquete de escuta, ele teria que chamar a bind(2)função.

Você pode verificar isso fazendo o download de bashfontes e olhando para ele. É implementado no lib/sh/netopen.carquivo na _netopen4função (ou _netopen6, que também suporta IPv6). Essa função é usada pela função wrapper netopendo mesmo arquivo, que por sua vez é usada diretamente no arquivo redir.c( redir_special_openfunção) para implementar esse redirecionamento virtual.

Você precisa encontrar outro aplicativo que possa criar um soquete de escuta em sua máquina.

Krzysztof Adamski
fonte
+1 o bash permite criar o soquete do cliente, mas o soquete do servidor que você pode usar nc ou pode ser implementado com perl ou c;
Nahuel Fouilleul 04/10/12
2
@NahuelFouilleul: Isso não está totalmente correto. Você pode processar muitos clientes com apenas um thread / processo usando a chamada programação de rede "assíncrona" ou "orientada a eventos" (tente pesquisar na função select () e como ela pode ser usada na programação de rede). Em muitos casos, é uma maneira muito melhor (mais rápida) de aceitar muitos clientes.
Krzysztof Adamski
Graças eu não fiz embora desta solução
Nahuel FOUILLEUL
4
É para isso que serve o xinetd. Ele escuta e gera seu processo / script arbitrário para todas as conexões recebidas. Com isso, qualquer coisa pode se tornar um servidor TCP / IP.
Evi1M4chine
0

Não há como escutar, porque escutar não está na festa, como apontou Adamski.

Mas você não precisa escutar no cliente para não precisar do netcat no cliente para transferir arquivos, por exemplo:

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1
A.Danischewski
fonte
-3

você pode fazer isso como disse, perguntando / dev / tcp, com o bash:

</dev/tcp/host/port

se for executado imediatamente, está ouvindo, de qualquer forma

serpiko
fonte
4
Não. Você definitivamente não testou isso e, se o fez, não deve entender os resultados. Sua sugestão abriria o soquete (não ouvir) e redirecionaria para qualquer comando que você executasse. Uma resposta correta já foi encontrada (quase 6 anos atrás ...), então não sei por que você escolheu necro esta pergunta.
H3rrmiller