我試圖讓我的 Debian 7 系統監聽連接埠 1815,netcat
並將傳入流量重定向到 VacuumFluorecentDisplay。 Iptables 是開放的,我使用 inetd 而不是 xinetd(隨發行版一起提供)。但我無法讓它按照我想要的方式工作
將以下行新增至 /etc/services
vfd 1815/tcp
vfd 1815/udp
將以下行加入 /etc/inetd.conf 中。
vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2"
答案1
這幾乎在所有可能的方面都是錯誤的。
inetd 中的命令列參數需要指定為單獨的單字—而不是作為單一字串引用。例如(只是為了演示語法更改;它仍然無法按原樣工作):
-- vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2" ++ vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2
由於歷史原因,inetd 需要服務的二進位文件和要單獨指定的第 0 個命令列參數,即使它們通常是相同的。例如(請注意,“nc”現在被指定兩次):
-- vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2
inetd 不使用 shell 來啟動服務,因此沒有任何東西可以解釋
> /dev/ttyS2
重定向;所有內容都只是作為命令列參數傳遞給 nc,而 nc 不知道如何處理它。這需要進行重大更改 - 要么明確使用 shell 來運行命令...
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/sh sh -c "nc -l 1815 > /dev/ttyS2"
……或使用一種完全不同的工具,該工具能夠在不依賴 shell 重定向的情況下開啟檔案:
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/socat socat -u tcp-listen:1815 file:/dev/ttyS2
最後,不能讓兩個程式單獨偵聽相同連接埠。 inetd 的全部要點是且僅 inetd將建立初始「偵聽」套接字,並且基於 inetd 的服務將僅使用它們已經建立的套接字遺傳來自“父”inetd。 (在「等待」模式下,它們繼承「偵聽」套接字,在「無等待」模式下,它們繼承各個客戶端連接套接字。)
換句話說,用作
nc -l
inetd 服務是沒有意義的,因為您要求它複製 inetd 已經完成的所有操作。相反,該服務需要使用現有的 stdin/stdout(inetd 已將其附加到連接套接字)。例如,這最終應該可以正常工作:
vfd stream tcp nowait root /bin/sh sh -c "cat > /dev/ttyS2"
這也應該有效:
vfd stream tcp nowait root /bin/socat socat -u stdio file:/dev/ttyS2