我正在尝试从python编写的简单telnet-server调用一些php脚本。这是一个代码。
# -*- coding: utf8 -*-
#!/usr/bin/env python
# скрипт перекидывает выполнение нужного скрипта на определённый порт
import socket
import os
from commands import *
import subprocess
#define server properties
host = ''
port = 5000
backlog = 5
size = 1024
# configure the server socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
# handle client requests
while 1:
client, address = s.accept()
data = client.recv(size)
print data
if data:
#находим путь для выполняемого скрипта
recvCommand = data[5:]
print recvCommand
userCommand = u'' + recvCommand
#userCommand = u''+'/home/mechanic/python/forloop.php'
res = subprocess.call(["php", userCommand])
client.send(data)
35 client.close()
在终端,我连接到localhost(telnet localhost 5000)并运行命令'calc /home/mechanic/python/forloop.php'。该路径存在于系统中,我可以手动运行它。 但脚本给我发了这个错误:
Could not open input file: /home/mechanic/python/forloop.php
但是如果我在python脚本中手动编写这个路径
userCommand = u''+'/home/mechanic/python/forloop.php'
一切正常。我哪里可以搞错?
P.S。这是forloop.php的代码
<?
for ( $i = 0 ; $i <= 1000000; $i++ )
echo "Welcome $i times\n";
?>
答案 0 :(得分:2)
您是否尝试过使用recvCommand.strip()
代替原创代码?我认为recvCommand包含来自telnet客户端的换行符和回车符。
您的命令接收有时可能会失败,无法保证所有数据都会在单个recv呼叫中到达。您应该连接数据,直到收到换行符。 在某些情况下,您的命令可能会到达多个缓冲区,您的代码将无法使用它。