OS X LoginHook - nc sai prematuramente sem motivo aparente

0

Estou tentando usar loginhook para baixar grandes quantidades de dados e tenho tido problemas com Eu acertei para nc sair prematuramente sem motivo aparente. Este é um script de teste simplificado:

#!/bin/bash exec > /tmp/lhook.out.txt 2> /tmp/lhook.err.txt nc -v server 4444 > /tmp/nc-test echo "Exit value: $?"

No servidor, quando executo um listener nc simples como echo "Hello world. | nc -l 4444 , a transferência funciona corretamente. Mas quando eu quero transferir um arquivo maior, como nc -l 4444 < /path/to/some/large.file , o cliente transfere apenas uma pequena parte (às vezes 2kiB, às vezes ~ 250 kiB). O valor de saída informado é 0.

Ah, e claro - o mesmo script executado em um Terminal.app dentro de uma sessão do usuário funciona bem.

Alguém pode ajudar com a depuração, explicar o que está acontecendo ou fornecer uma solução?

EDITAR : Eu tive dtruss snoop no syscalls do netcat, e é isso que eu recebi:

  157/0x4c6:  write(0x1, "j,0767734$f1F60&f
  157/0x4c6:  write(0x1, "j,0767734$f1F60&f%pre%4%pre%", 0x400)                 = 1024 0
  157/0x4c6:  select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0)                 = 1 0
  157/0x4c6:  read(0x4, "%pre%1u4)u\f5\f6340%pre%31%pre%1\b3577%pre%337P377R%pre%4177%pre%", 0x400)    
         = 1024 0
  157/0x4c6:  write(0x1, "%pre%1u4)u\f5\f6340%pre%31%pre%1\b3577%pre%337P377R%pre%4177%pre%", 0x400)   
         = 1024 0
  157/0x4c6:  select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0)                 = 1 0
  157/0x4c6:  read(0x4, "%pre%", 0x400)             = 0 0
  157/0x4c6:  shutdown(0x4, 0x0, 0x0)            = -1 Err#57
  157/0x4c6:  close(0x4)                 = 0 0
  157/0x4c6:  close(0x3)                 = 0 0
  157/0x4c6:  close(0x3)                 = -1 Err#9
4%pre%", 0x400) = 1024 0 157/0x4c6: select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0) = 1 0 157/0x4c6: read(0x4, "%pre%1u4)u\f5\f6340%pre%31%pre%1\b3577%pre%337P377R%pre%4177%pre%", 0x400) = 1024 0 157/0x4c6: write(0x1, "%pre%1u4)u\f5\f6340%pre%31%pre%1\b3577%pre%337P377R%pre%4177%pre%", 0x400) = 1024 0 157/0x4c6: select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0) = 1 0 157/0x4c6: read(0x4, "%pre%", 0x400) = 0 0 157/0x4c6: shutdown(0x4, 0x0, 0x0) = -1 Err#57 157/0x4c6: close(0x4) = 0 0 157/0x4c6: close(0x3) = 0 0 157/0x4c6: close(0x3) = -1 Err#9

Eu estou supondo que, por algum motivo, o kernel está dando nc EOF em vez de esperar por mais dados.

    
por myxal 28.01.2015 / 10:10

1 resposta

0

Que supervisão embaraçosa ...: - (

nc fecha ao ler EOF de stdin. O cliente que recebe os dados executa o script LoginHook em um shell não interativo, o que direciona provavelmente o descritor de stdin de nc para /dev/null . Assim que lê EOF, sai.

A correção é trivial: forneça a chave -d para o lado de recebimento. Isso impede que qualquer versão do netcat (BSD ou Linux) leia stdin e o transfrer seja concluído sem problemas.

    
por 29.01.2015 / 14:28