1

我正在尝试从用 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'

一切正常。我可以在哪里犯错?

PS这里是forloop.php的代码

<?
for (  $i = 0 ;  $i <= 1000000;  $i++  )
echo "Welcome $i times\n";
?>
4

1 回答 1

2

您是否尝试过使用recvCommand.strip()而不是原始的?我认为 recvCommand 包含来自 telnet 客户端的换行符和回车符。

您的命令接收有时可能会失败,不能保证所有数据都会在单个 recv 调用中到达。您应该连接数据,直到收到换行符。在某些情况下,您的命令可能会到达多个缓冲区,您的代码将无法使用它。

于 2012-08-15T08:23:22.550 回答