将Python服务器的输出发送回客户端
我现在有一个小的JavaScript服务器,它运行得很好,调用方式如下:
<?php
$handle = fsockopen("udp://78.129.148.16",12345);
fwrite($handle,"vzctlrestart110");
fclose($handle);
?>
在一台远程服务器上,正在运行一个Python服务器,并执行命令:
#!/usr/bin/python
import os
import socket
print " Loading Bindings..."
settings = {}
line = 0
for each in open('/root/actions.txt', 'r'):
line = line + 1
each = each.rstrip()
if each != "":
if each[0] != '#':
a = each.partition(':')
if a[2]:
settings[a[0]] = a[2]
else:
print " Err @ line",line,":",each
print " Starting Server...",
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", port))
print "OK."
print " Listening on port:", port
while True:
datagram = s.recv(1024)
if not datagram:
break
print "Rx Cmd:", datagram
if settings.has_key(datagram):
print "Launch:", settings[datagram]
os.system(settings[datagram]+" &")
s.close()
我想知道,是否可以轻松地将命令的输出发送回去。当服务器启动并运行命令时,输出会显示在SSH窗口中,但我希望这个输出能发送回原始客户端的浏览器。也许可以让浏览器等待15秒,然后检查通过socket接收到的数据。
我知道我要求的有点多,不过我正在创建一个PHP脚本,我对这方面有很多了解,但我对Python的知识就比较薄弱了。
谢谢,
Ashley
2 个回答
0
这里有一个例子,教你怎么获取一个命令的输出结果:
>>> import commands
>>> s = commands.getoutput("ls *")
>>> s
'client.py'
1
是的,你可以读取命令的输出。为此,我推荐使用Python的subprocess模块。然后你可以直接用s.write()
把它写回去。
当然,这样做有一些影响,你可能需要让你的PHP脚本运行得更久一点,因为这个过程可能会比较慢。
# The pipe behaves like a file object in Python.
process = Popen(cmd, shell=True, stdout=PIPE)
process_output = ""
while process.poll():
process_output += process.stdout.read(256)
s.write(process_output)
# Better yet.
process = Popen(cmd, shell=true, stdout=PIPE)
stdout, stderr = process.communicate() # will read and wait for process to end.
s.write(stdout)
集成到你的代码中:
# ... snip ...
import subprocess
con, addr = s.accept()
while True:
datagram = con.recv(1024)
if not datagram:
break
print "Rx Cmd:", datagram
if settings.has_key(datagram):
print "Launch:", settings[datagram]
process = subprocess.Popen(settings[datagram]+" &", shell=True, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()
con.send(stdout)
con.close()
s.close()