我正在尝试捕获发往“网络打印机”的数据,以便可以在本地处理或转发到另一个系统。看起来像Linux 作为网络打印机设备(Raw,端口 9100)
会做我想做的事情,并且只需要:
9100 stream tcp nowait cat > some_file
但我希望能够在我的 Macbook 上测试它,但它没有inetd
.
我可能可以使用它launchd
,因为它是 OSX 上的替代品inetd
,但阅读文档后,并不清楚如何执行与上述相同的操作。因此,无论是解决方案 - 如何获取inetd
OSX 或如何创建一个 plist 文件来launchd
执行等效操作都是我正在寻找的。
答案1
现有的启动XML文件/Library/LaunchDaemons
还是/System/Library/LaunchDaemons
值得研究的;来自其中之一并进行了一些探索/etc/services
$ grep 9100 /etc/services
hp-pdl-datastr 9100/udp # PDL Data Streaming Port
hp-pdl-datastr 9100/tcp # PDL Data Streaming Port
人们可以将现有文件之一改编为我保存的文件/Library/LaunchDaemons/cattery.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>com.exampe.cattery</string>
<key>ProgramArguments</key>
<array>
<string>/var/root/cattery</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
<key>InitGroups</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>hp-pdl-datastr</string>
<key>SockType</key>
<string>stream</string>
</dict>
</dict>
</dict>
</plist>
这里/var/root/cattery
是错误的测试脚本(如果客户端每秒连接两次或多次会发生什么?):
$ sudo cat /var/root/cattery
#!/bin/sh
cat > "/var/root/out.$(date +%s)"
$ sudo chmod +x /var/root/cattery
然后我们启用我们的新服务
$ sudo launchctl load -w /Library/LaunchDaemons/cattery.plist
并向其提供一些测试数据
$ echo foo | nc localhost 9100
$ sudo find /var/root -name out\* -maxdepth 1
/var/root/out.1511845970
$ sudo cat /var/root/out.1511845970
foo
$
注意此代码可能不应该root
作为
<key>UserName</key>
<string>_lp</string>
中看到的行/System/Library/LaunchDaemons/org.cups.cups-lpd.plist
可能有助于不运行上面的 as root
,在这种情况下,保存的数据的输出目录必须可由该用户写入,并且程序可由该用户运行可执行文件(也可能是可读的)。