Como canalizar comandos para um netcat que permanecerá vivo?


32
echo command | netcat host port

Isso resulta no envio do comando ao host remoto e na leitura de alguns dados. Mas, após alguns segundos, a conexão é fechada. O parâmetro -w não mudou nada. Estou usando o netcat v1.10 no SuSE 10.1.


Tem certeza de que não é o host remoto que fecha a conexão?
grawity

Sim. A execução do netcat e a digitação manual do comando fazem com que o netcat permaneça ativo indefinidamente.
24411 Chris

Por que permaneceria vivo? basta imprimir os parâmetros de eco e depois morrer?
M'vy

1
Quero que ele permaneça ativo para continuar recebendo os dados provenientes do servidor remoto.
31411 Chris

2
Isso não é verdade. "netcat <host> <port>" abre um soquete TCP bidirecional.
Chris

Respostas:


33

Isso funciona com o nccomando no OS X (assumindo que o comando que você deseja enviar esteja em um arquivo):

cat file - | nc host port

(Essencialmente, catdespeja o conteúdo do arquivo no stdout e espera por você no stdin).

Por extensão, se você deseja enviar o comando do próprio shell, você pode fazer o seguinte:

cat <(echo command) - | nc host port

É bom, pois funciona em um sistema embarcado muito simples, onde o netcat carece de todas as opções sofisticadas.
SF.

{ echo command; cat;}faria o mesmo e pode ser considerado mais fácil de entender.
G-Man diz 'Reinstate Monica'

1
A meu ver, o netcatcomando manterá o soquete aberto até o final da entrada. Todos esses exemplos demonstram isso sem realmente dizer muito sobre o porquê . Estou interagindo com servidor usando por um longo período apenas usando: . O SocketTest é uma ferramenta útil que pode escutar ou servir em qualquer porta TCP ou UDP. SocketTest netcatcat - | nc localhost 8063
será

14

Com ncno Ubuntu:

nc -q -1 host port

Na página de manual do Ubuntunc :

 -q seconds
         after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.

Observe que as ncopções disponíveis variam muito entre as distribuições, portanto, isso pode não funcionar na sua (OpenSUSE).


13

Eu encontrei:

echo command | netcat host port -

Meu colega sabia disso. Não vejo isso na documentação.


2

Eu não acho que você vai gerenciar isso com o netcat ou o socat. Acabei de mexer bastante nos dois, e o socat parecia o mais promissor.

Eu consegui configurar o socat para conectar à porta TCP remota e ouvir em um soquete de domínio unix local (em teoria, para que o link pudesse ser mantido o tempo todo), mas assim que o processo local foi desconectado do soquete unix (outro socat ligando o soquete unix ao stdin / out) fechou a sessão socat do TCP.

O problema aqui é que cada conexão através do netcat / socat faz uma nova conexão de fluxo TCP com o servidor e fecha a sessão de fluxo TCP quando a extremidade local é desconectada.

Eu acho que você provavelmente precisará escrever um software proxy personalizado para isso, que abra a conexão TCP para a extremidade remota e escute localmente em um soquete / pipe / fifo ou qualquer outra coisa e depois envie os dados pelo canal TCP existente e retorna os resultados.


Ouça o todo-poderoso Matt Jenkins: D
M'vy

2

Será que a conexão está fechada na outra extremidade do soquete?

Por padrão, ncfecha a conexão após a conclusão, se você não disser explicitamente para ele ficar ouvindo (com a -kopção):

 -k    Forces nc to stay listening for another connection after its current
       connection is completed.  It is an error to use this option without the
       -l option.

Veja man nc.1.


Estou conseguindo transmitir dados com êxito entre duas máquinas como esta:

  • remetente:

    while (true); do 
      echo -n "$RANDOM " | nc <host> <port>
    done
    
  • receptor:

    nc -kl <port> 
    

1

O método de Georges funciona bem a partir de um shell interativo, mas não ajuda em scripts, quando você está chamando seu script como nohup ./script &.

Eu encontrei substituindo stdin por um manequim fifo ajuda.

 mkfifo dummy
 cat command.txt dummy | nc host port

Como nada é gravado no fifo, após a saída do arquivo, catele permanece indefinidamente.


0

socatA shut-noneopção de deve ajudar aqui:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

Você provavelmente também precisará substituir o período de tempo limite padrão usando -t <timeout>, caso contrário, o soquete será fechado após 0,5s. Esta opção substitui o comportamento padrão, que é:

When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.

Portanto, um comando como:

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

manterá o soquete aberto por 10 segundos após o envio do 'blá'.


0

Seu comando é finalizado, se o host remoto fechar a conexão (ou não estiver acessível) ou o comando antes que o canal seja finalizado (enquanto o netcat ainda envia o restante de sua fila de entrada).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.