标签: xinetd

Haskell默认io缓冲

昨天我给我的学生写了一个小小的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)

但是这个更正的版本也行不通.我阅读了缓冲文档并使用各种设置进行了播放.如果我设置NoBufferingLineBuffering,我的程序正常工作.最后,我打印出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

  • xinetd tcp服务和cli程序有什么区别,关于缓冲?
  • 如果我想用两种运行方法编写一个工作程序,我是否必须手动设置缓冲?

编辑:谢谢大家的有用答案.

我接受了大火给出的答案,他给了我一个isatty的暗示(3).我再次浏览了System.IO文档并找到了hIsTerminalDevice函数,我可以检查句柄的连接.

为了记录,这是我的最终计划:

{-# OPTIONS_GHC -W #-}

import System.IO

main = do
  hSetBuffering …
Run Code Online (Sandbox Code Playgroud)

haskell buffering xinetd

13
推荐指数
2
解决办法
2705
查看次数

当xinetd通过udp接收消息时,将参数传递给Bash脚本

我想知道当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)

亲切的问候,非常感谢你!

linux bash ubuntu udp xinetd

6
推荐指数
1
解决办法
1902
查看次数

Xinetd 禁用 stderr 重定向

我只是为我的一个二进制文件设置了 xinetd 作为服务运行。但是在我看来,stdout 和 stderr 都被重定向到了套接字流中。

无论如何要禁用 stderr 吗?我在xinetd设置的服务器字段中尝试:server = binary 2>/dev/null但它不起作用

谢谢

linux shell service networking xinetd

6
推荐指数
1
解决办法
1338
查看次数

从sys.stdin读取没有换行符或EOF

我想从我的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 …

python tcp tcplistener xinetd

4
推荐指数
2
解决办法
2万
查看次数

Xinetd 错误服务/协议组合不在 /etc/services 中

尝试创建一个简单的 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

service xinetd

3
推荐指数
1
解决办法
1316
查看次数

Ubuntu 13.10上的Firebird Classic服务器监听远程连接

我在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绑定到所有接口.但我仍然无法通过该端口上的远程连接.防火墙已禁用.

firebird2.5 xinetd

2
推荐指数
1
解决办法
4632
查看次数