昨天我给我的学生写了一个小小的xinetd练习:做一个反向回音程序.
为了学习新东西,我试图实现一个Haskell解决方案.琐碎的main = forever $ interact reverse行为不起作用.我仔细检查了这个问题并做了更正后的版本:
import Control.Monad
import System.IO
main = forever $ interact revLines
revLines = unlines . map (reverse) . lines
Run Code Online (Sandbox Code Playgroud)
但是这个更正的版本也行不通.我阅读了缓冲文档并使用各种设置进行了播放.如果我设置NoBuffering或LineBuffering,我的程序正常工作.最后,我打印出stdin和stdout的默认缓冲模式
import System.IO
main = do
hGetBuffering stdin >>= print
hGetBuffering stdout >>= print
Run Code Online (Sandbox Code Playgroud)
我有BlockBuffering Nothing(如果我运行从我的xinetd的程序echo "test" | nc localhost 7),但是从CLI我有LineBuffering
编辑:谢谢大家的有用答案.
我接受了大火给出的答案,他给了我一个isatty的暗示(3).我再次浏览了System.IO文档并找到了hIsTerminalDevice函数,我可以检查句柄的连接.
为了记录,这是我的最终计划:
{-# OPTIONS_GHC -W #-}
import System.IO
main = do
hSetBuffering …Run Code Online (Sandbox Code Playgroud) 我想知道当xinetd通过udp从随机主机(在lan中)接收命令时是否可以将args传递给bash脚本.要清除:当我从一个随机客户端发送hello到xinetd服务器时,我希望xinetd服务器将hello传递给我指定的bash脚本.用同样的事情的世界.
这是我的xinetd服务文件:
service test
{
socket_type = dgram
protocol = udp
port = 65534
type = UNLISTED
wait = yes
user = root
server = /root/sendmail
server_args = **Received Message from UDP connection**
}
Run Code Online (Sandbox Code Playgroud)
亲切的问候,非常感谢你!
我只是为我的一个二进制文件设置了 xinetd 作为服务运行。但是在我看来,stdout 和 stderr 都被重定向到了套接字流中。
无论如何要禁用 stderr 吗?我在xinetd设置的服务器字段中尝试:server = binary 2>/dev/null但它不起作用
谢谢
我想从我的gps-tracker收到数据.它通过tcp发送数据,所以我使用xinetd来监听一些tcp端口和python脚本来处理数据.这是xinetd配置:
service gps-gprs
{
disable = no
flags = REUSE
socket_type = stream
protocol = tcp
port = 57003
user = root
wait = no
server = /path/to/gps.py
server_args = 3
}
Run Code Online (Sandbox Code Playgroud)
在/ etc/services中配置
gps-gprs 57003/tcp # Tracking system
Run Code Online (Sandbox Code Playgroud)
和Python脚本gps.py
#!/usr/bin/python
import sys
def main():
data = sys.stdin.readline().strip()
#do something with data
print 'ok'
if __name__ =='__main__':
main()
Run Code Online (Sandbox Code Playgroud)
跟踪器以原始文本发送数据字符串
$GPRMC,132017.000,A,8251.5039,N,01040.0065,E,0.00,,010111,0,,A*75+79161234567#
Run Code Online (Sandbox Code Playgroud)
问题是python脚本中的sys.stdin不接收行尾或文件结束字符,sys.stdin.readline()永远不会.我试图用python脚本从另一台PC发送数据
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('', 57003))
s.sendall( u'hello' )
data = s.recv(4024)
s.close()
print 'Received', data
Run Code Online (Sandbox Code Playgroud)
如果消息是'hello',它会失败,但是如果消息是'hello …
尝试创建一个简单的 xinetd 风格服务器,而不需要先创建完整的服务。我有以下文件,位于/etc/xinetd.d/myscript:
service tester
{
disable = no
socket_type = stream
protocol = tcp
port = 8087
wait = no
user = root
server = /root/prog
}
Run Code Online (Sandbox Code Playgroud)
但重新启动 xinetd 时,我不断收到以下错误:
service/protocol combination not in /etc/services
我在Ubuntu(13.10)上安装了Firebird Classic,我需要将它打开到远程连接.端口3050上的netstat -an显示:
tcp 0 0 127.0.0.1:3050 0.0.0.0:* LISTEN
我尝试编辑/etc/xinet.d/firebird25以监听eth0上的所有内容,我尝试编辑firebird.conf绑定到所有接口.但我仍然无法通过该端口上的远程连接.防火墙已禁用.
xinetd ×6
linux ×2
service ×2
bash ×1
buffering ×1
firebird2.5 ×1
haskell ×1
networking ×1
python ×1
shell ×1
tcp ×1
tcplistener ×1
ubuntu ×1
udp ×1