
我正在嘗試使用登入鉤子下載大量數據,我一直遇到問題,我已將其確定為 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 中執行的相同腳本工作正常。
有人可以幫助調試、解釋發生了什麼或提供解決方案嗎?
編輯:我已經窺探了dtruss
netcat 的系統調用,這就是我得到的:
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,並且傳輸可以順利完成。