我正在尝试让我的 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 的服务将只使用它们已经遗传来自“父”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