OS X LoginHook - nc 無明顯原因過早退出

OS X LoginHook - nc 無明顯原因過早退出

我正在嘗試使用登入鉤子下載大量數據,我一直遇到問題,我已將其確定為 nc 無明顯原因過早退出。這是一個簡化的測試腳本:

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

在伺服器上,當我運行像 這樣的簡單 nc 偵聽器時echo "Hello world. | nc -l 4444,傳輸工作正常。但是,當我想傳輸較大的檔案(例如)時nc -l 4444 < /path/to/some/large.file,客戶端僅傳輸一小部分(有時 2kiB,有時 ~250 kiB)。報告的退出值為 0。

哦,當然 - 在用戶會話內的 Terminal.app 中執行的相同腳本工作正常。

有人可以幫助調試、解釋發生了什麼或提供解決方案嗎?

編輯:我已經窺探了dtrussnetcat 的系統調用,這就是我得到的:

  157/0x4c6:  write(0x1, "j,\350\037\376\377\377\203\304$f\211F\016\350&f\004\0", 0x400)                 = 1024 0
  157/0x4c6:  select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0)                 = 1 0
  157/0x4c6:  read(0x4, "\001u\374)u\f\215\f6\203\304\020\003\331\001\b\353\035\017\267\003\213\027P\213\317\377R\004\271\377\377\0", 0x400)    
         = 1024 0
  157/0x4c6:  write(0x1, "\001u\374)u\f\215\f6\203\304\020\003\331\001\b\353\035\017\267\003\213\027P\213\317\377R\004\271\377\377\0", 0x400)   
         = 1024 0
  157/0x4c6:  select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0)                 = 1 0
  157/0x4c6:  read(0x4, "\0", 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

我猜測由於某種原因,內核正在給出 nc EOF 而不是等待更多數據。

答案1

多麼令人尷尬的疏忽…:-(

nc從 stdin 讀取 EOF 後退出。接收資料的客戶端在非互動式 shell 中執行 LoginHook 腳本,該腳本將nc的 stdin 描述符可能定向到/dev/null.一旦從中讀取到 EOF,它就會退出。

修復方法很簡單:將電源開關-d連接到接收側。這可以防止任一版本的 netcat(BSD 或 Linux)讀取 stdin,並且傳輸可以順利完成。

相關內容