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 に答える