3

最終的にPythonサーバーが動作し、出力で複数のコマンドに応答しましたが、完全な出力を受け取るPHPに問題が発生しています。fgets、fread などのコマンドを試しましたが、機能しているように見えるコマンドは「fgets」だけです。

ただし、これはオンラインのデータのみを受信するため、以下に示す while ステートメントを作成しました。

 while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    echo $buffer;
}

ただし、Python サーバーは出力の最後に Feof を送信していないようで、php ページがタイムアウトして何も表示されません。上で述べたように、echo fgets($handle) を実行するだけで問題なく動作し、出力は 1 行であり、どちらのコマンドも実行しないで再度コマンドを実行すると、次の行が表示されます。

Python スクリプトの重要な部分を以下に添付しました。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", port))
s.listen(5)
print "OK."
print "  Listening on port:", port
import subprocess
while 1:
    con, addr = s.accept()
    while True:
        datagram = con.recv(1024)
        if not datagram:
            break
        print "Rx Cmd:", datagram
        print "Launch:", datagram
        process = subprocess.Popen(datagram+" &", shell=True, stdout=subprocess.PIPE)
        stdout, stderr = process.communicate()
        con.send(stdout)
    con.close()
s.close()

完全な PHP スクリプトも添付しました。

<?php
$handle = fsockopen("tcp://xxx.xxx.xxx.xxx",12345);
fwrite($handle,"ls");
echo fgets($handle);
fclose($handle);
?>

ありがとう、アシュリー

4

1 に答える 1

1

サーバーコードを少し修正する必要があると思います。内側のwhileループを削除しました。コードの問題は、サーバーが接続を閉じなかったため、feoftrueが返されないことでした。

私も+ " &"ビットを削除しました。出力を取得するには、とにかくプロセスが終了するまで待つ必要があります。&そして、この場合、シェルがどのように処理するかはわかりません。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", port))
s.listen(5)
print "OK."
print "  Listening on port:", port
import subprocess
try:
    while 1:
        con, addr = s.accept()
        try:
            datagram = con.recv(1024)
            if not datagram:
                continue
            print "Rx Cmd:", datagram
            print "Launch:", datagram
            process = subprocess.Popen(datagram, shell=True, stdout=subprocess.PIPE)
            stdout, stderr = process.communicate()
            con.send(stdout)
        finally:
            print "closing connection"
            con.close()
except KeyboardInterrupt:
    pass
finally:
    print "closing socket"
    s.close()

ところで、phpスクリプトでwhileループを使用する必要があります。fgets1行のみになるまで戻ります。

于 2009-06-21T18:19:09.373 に答える