1

我读到这个:

您可以使用 xinetd 添加启动您的 python 脚本的服务。标准输入和输出将通过网络在所需端口上传输,因此您无需修改​​脚本(输入/原始输入和打印方法可以正常工作)。

因此,当与 192.168.240.37:65123 建立 TCP 连接时,我使用自定义 xinet 服务来启动 script.py。行为不符合预期/预期。

/root/script.py

#! /usr/bin/python
my_name = raw_input("Enter your name: ")
print my_name
quit()

/etc/xinetd.d/netunique-server

service netunique
{
    disable         = no
    id              = netunique-server
    type            = unlisted
    wait            = no
    socket_type     = stream
    protocol        = tcp
    user            = root
    server          = /usr/bin/python
    server_args     = /root/script.py
    port            = 65123
    flags           = IPv4 REUSE
    bind            = 192.168.240.37
}

systemctl 状态 xinetd

Nov 11 21:24:00 netunique.ourhome.com xinetd[2161]: xinetd Version 2.3.15 started with libwrap loadavg labeled-ne... in.
Nov 11 21:24:00 netunique.ourhome.com xinetd[2161]: Started working: 1 available service

telnet 192.168.240.37 65123(预期行为)

[root@netunique xinetd.d]# telnet 192.168.240.37 65123
Trying 192.168.240.37...
Connected to 192.168.240.37.
Escape character is '^]'.
Enter your name: John Smith          <-- I type name after prompt here
John Smith                           <-- Script prints entry back to screen
Connection closed by foreign host.   <-- Script does its quit()   

telnet 192.168.240.37 65123(实际行为)

[root@netunique xinetd.d]# telnet 192.168.240.37 65123
Trying 192.168.240.37...
Connected to 192.168.240.37.
Escape character is '^]'.
<blank>                              <-- no prompt as expected
John Smith                           <-- I enter some data and hit Enter
Enter your name: John Smith          <-- Hard to tell exactly what happened here
Connection closed by foreign host.   <-- Hard to tell exactly what happened here
[root@netunique xinetd.d]# 

当我说“很难确切地说出这里发生了什么”时,我的意思是很难判断在上面的输出中出现在“输入你的名字:”提示之后的“约翰·史密斯”是否是 print 语句的结果,并且很难判断“连接被外部主机关闭”是否是 quit() 语句的结果。

nc 192.168.240.37 65123(实际行为)

[root@netunique xinetd.d]# nc 192.168.240.37 65123
<blank>                              <-- no prompt as expected
John Smith                           <-- I enter some data and hit Enter
Enter your name: John Smith          <-- Hard to tell exactly what happened here
                                     <-- Nothing happened here, I hit Enter
                                     <-- I hit Enter again
Ncat: Broken pipe.                   <-- This is the end result

如您所见,我与 netcat 的行为非常相似。

4

1 回答 1

2

对我来说真正的问题显然是我缺乏套接字编程知识。我发现这篇文章在线搜索“xinetd python no data”(https://mail.python.org/pipermail/python-list/2007-July/423659.html),这至少帮助我让我的东西正常工作通过示例说明了套接字编程的实际工作原理。解决方案如下,我从原始脚本中删除了 raw_input 并将其替换为帖子中的概念。

/root/script.py(原始)

#! /usr/bin/python
my_name = raw_input("Enter your name: ")
print my_name
quit()

/root/script.py (修改和工作)

#! /usr/bin/python
import sys
print "Enter your name:"                
sys.stdout.flush()
my_name = sys.stdin.readline().strip()
print "Your name is %s" % my_name
sys.stdout.flush()
quit()

telnet 192.168.240.37 65123(实际行为-工作)

[root@netunique ~]# telnet 192.168.240.37 65123
Trying 192.168.240.37...
Connected to 192.168.240.37.
Escape character is '^]'.
Enter your name:
Bob Smith
Your name is Bob Smith
Connection closed by foreign host.
于 2017-11-14T07:45:25.793 回答