ncat comando dá Tempo limite ocioso expirado ao usar a opção “-i”

0

Estou usando o comando nc para enviar um arquivo para um dispositivo. É assim que eu o uso:

nc -i1 "device ip" "port" < /path/to/file

este comando funciona bem no Scientific Linux 6.4 de 32 bits, mas depois de atualizar para o CentOS 7.4 de 64 bits, o comando retorna

Ncat: Idle timeout expired (1000 ms)

Percebi que há um item do bugzilla no site da RedHat aqui , eles estão dizendo que nc está sendo substituído por ncat e não funcionou. Eu até tentei cat o arquivo, em seguida, canalizei para nc ou ncat e ele não funcionou. Alguma dica sobre como resolver esse problema?

    
por 3bdalla 14.02.2018 / 14:08

3 respostas

2

O problema com certeza é a opção -i . Pelo menos três versões diferentes de nc existem. openbsd-netcat , gnu-netcat e nmap-ncat .

Você provavelmente mudou de uma das versões nc , em que -i significa intervalo de buffer para nmap one, em que -i significa tempo limite. Então, solte a opção -i ou substitua por -d .

Abaixo, eu coloquei linhas manuais para a opção -i de cada nc versão mencionada. Eu também incluí -d para a versão nmap .

OpenBSD:

-i interval        Specifies a delay time interval between lines of text sent and received. Also causes a delay time between connections to multiple ports.

GNU:

-i SECS
--interval SECS    sets the buffering output delay time. This affects all the current modes and makes the connection sock to buffer outgoing data. This means that in tunnel mode everything received from the listening socket is buffered for the connect socket.

NMAP:

-i, --idle-timeout <time>  Idle read/write timeout

-d time, --delay time (Specify line delay)
       Set the delay interval for lines sent. This effectively limits
       the number of lines that Ncat will send in the specified period.
       This may be useful for low-bandwidth sites, or have other uses
       such as coping with annoying iptables --limit options.
    
por 07.03.2018 / 15:57
1

Esta é uma falha de design na versão nmap de ncat que é usada no RHEL7. Eu estou olhando para o código-fonte da versão 7.70 (RHEL7 é 7.50, o Fedora 28 é 7.60 e eu não acho que esse aspecto do código tenha mudado muito entre isso e 7.70).

Em ncat_connect.c , posso ver o código para:

  • sair após o EOF no stdin no modo --send-only ,
  • sair após o EOF no soquete no modo --recv-only ,

mas, se não estiver no modo --send-only nem --recv-only , não há nada em ncat_connect.c para lidar com a saída quando vimos EOF no stdin e no soquete.

Portanto, analisamos o código de nível inferior na função nsock_core.c nsock_loop . Esse loop será encerrado se ms->quit for definido (pelo código --send-only e --recv-only acima mencionado) ou se não houver events_pending .

Mas aqui está o erro: o tempo limite conta em events_pending . Então, nsock_loop diz "OK, eu sei que stdin foi EOF'd e o soquete foi EOF'd, mas eu ainda não vou sair ainda, porque ainda há um evento pendente" (o tempo limite), então fica lá até o tempo limite ser acionado e, em seguida, nc error-exits , mesmo que tudo tenha funcionado bem.

Então eu acho que nós deveríamos enviar um relatório de erros diretamente para o nmap (não para sua distro: eles provavelmente dirão "que é um comportamento upstream que não estamos qualificados para avaliar", enquanto mantenedores upstream serão capaz de avaliá-lo): salientamos que o design acima significa que -i é inútil, a menos que (1) seja usado juntamente com --send-only ou --recv-only ou (2) usado em uma situação onde nc erro código é ignorado.

Enquanto isso, uma das seguintes soluções alternativas pode ajudar:

  • Use --send-only ou --recv-only (se apropriado para o seu caso de uso),
  • Agrupe o comando nc em um comando timeout em vez de usar -i ,
  • Instale manualmente uma versão diferente de nc , como o GNU Netcat ou o nc-1.10 original - mas para fazer isso no RHEL7 ou Fedora 28, você precisará instalar manualmente, como pacotes ( atualmente) fornecem apenas nmap-ncat .
por 29.08.2018 / 15:17
0

Eu iniciei um contêiner centos7 e consegui reproduzir seu erro:

[root@34630a8f0b7c /]# nc 192.168.1.210 1234 < sarassa 
[root@34630a8f0b7c /]# nc -i 1 192.168.1.210 1234 < sarassa 
Ncat: Idle timeout expired (1000 ms).

A opção -i adiciona apenas um tempo limite no final da transferência de arquivos, portanto, não está claro o que você deseja alcançar com isso

    
por 06.03.2018 / 16:53

Tags