2017-12-04 5 views
0

ユーザーデータをPythonスクリプトに渡す小さなWebアプリケーションをセットアップしました。 Pythonは仕事に行き、Webサーバー上にファイルを作成し、ユーザーがそれをダウンロードできるようになっています。ただし、Python write()コマンドが発行された場所でスクリプトの実行が停止しているようです。PHPで呼び出されたpythonスクリプトは書き込めません

のPython:

print("Writing to '" + filename + "'") 
f = open('backups/' + filename, 'w') 
f.write(self.output()) 
f.close() 
print("Done!") 

PHP:

$user = escapeshellarg($_POST['user']); 
$password = escapeshellarg($_POST['password']); 
$command = './backup.py '.$user.' '.$password; 
print(exec($command)); 

実際の結果:

  1. Pythonが目的のディレクトリにファイルを作成していますが、R空になる。 2. Pythonは "Done!"を出力しません。

期待される結果(パーミッションが拒否されているため): "!完了"

  1. Pythonが印刷に進み
  2. Pythonのデータのファイルを作成します私がやった

呼び出し元のPHPスクリプトの出力は以下の通りです:

  1. WWW-データは#!/usr/bin/env python3シェバングがあるディレクトリ./backup
  2. のグループ書き込み権限(drwxrwsr-x)を持っていますPythonファイルに存在
  3. pythonファイルが実行可能です
  4. でユーザwww-dataに変更したときその後、phpコマンドラインを起動し、私のPythonスクリプトを呼び出す上記のコマンドを入力すると、ファイルが正しく作成されます!私は組み込みのPHPサーバーを起動した場合、それはまた、正常に動作します
  5. 、PHPスクリプトがapacheのを介して処理されている場合にのみ、それは私が正式に私の人生の一日を無駄にしている
+0

あなたはここで物事をエスケープするかもしれません。 'escapeshellarg'呼び出しで十分であるはずです。'escapeshellcmd'は、物事を壊すエスケープを追加するかもしれません。 – tadman

+0

提案をいただきありがとうございます。余分なエスケープを削除しました。しかし、スクリプトはまだファイルに書き込めません。それはファイルを作成することができると思われるので、私は許可が大丈夫だと思いますか? – bluppfisk

+0

ウェブサイトがPHP組み込みサーバ(php -S localhost:8000)を介して提供されていてもApacheが提供している場合はうまく動作します。 – bluppfisk

答えて

1

を動作しません。

権限は問題ありませんでした。 何が起こっていたのは、pythonスクリプトがPHPスクリプトを通して呼び出されている場合にのみ失敗し、それがApacheによって提供されていた場合のみです。

Apacheのエラーログを見ると、ファイルにバイトを書き込めず、Unicodeデータが出力にあるためにASCII変換が失敗したため、Pythonスクリプトが失敗したことが明らかになりました。

f = open(filename, 'wb')が問題を解決しました。

この動作は、開発マシンや組み込みのPHPサーバーでは確認されませんでした。それでもファイル処理に違いがあるのは不思議です。もし誰かがいるなら、答えを感謝します。

関連する問題