我读到了这个:
您可以使用xinetd添加启动python脚本的服务。标准输入和输出将通过网络在所需端口上传输,因此您无需修改脚本(输入/ raw_input和打印方法可以正常工作)。
因此,当建立到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 status 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]#
当我说“很难确切地说出这里发生了什么”时,我的意思是很难说在上面的输出中是否出现了'输入你的名字后出现的'John Smith':'提示是打印的结果声明并且很难判断“外部主机关闭的连接”是否是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的行为非常相似。
答案 0 :(得分: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.