通常、権限のないユーザーのためにシンボリックリンクを介してPHPのファイルにアクセスする

通常、権限のないユーザーのためにシンボリックリンクを介してPHPのファイルにアクセスする

私はこのウェブサイトを持っていますが、ユーザーがフォームを送信すると、PythonスクリプトはPHPページで実行され、Pythonスクリプトはzipファイルを生成してリンクからダウンロードできるようにユーザーに提供する必要があります。ファイルは容量が大きい場合があります(数GB)。

私は大学のサーバーで働いているので、そのサーバーのルールと機能に厳密に従います。問題はこれである:

ウェブサイトは/data/mywebsite限られたディスク容量に保存されています。もちろん、www-dataこれは主に私のApacheサーバーからアクセスされるので、このファイルは私の所有です。

/experimentdata/たとえば、1人のユーザーだけがアクセスできる1TBのストレージスペースがありますtheuser。これは、フォルダがSambaにマウントされており、単一の特定のユーザーIDでアクセスできるためです。

からファイルを生成するために/experimentdataユーザーとしてファイルを生成するコマンドを使用しますsudo -u theuser。今私の質問は:Apacheダウンロードリンクを介してこのファイルをどのように提供できますか?/experimentdata/downloadme.ziptheuser

たとえば、私が入れたシンボリックリンクを使用しようとしました/data/mywebsite/download/downloadme.zip。問題は、ユーザーがwww-dataファイルを読み取る権限がないことです!

ユーザーに/experimentdata/downloadme.zipユーザーと一緒にファイルをダウンロードさせるにはどうすればよいですか?www-datatheuser

明らかに言いたいのは、sudo -u theuser参加することが絶対に大丈夫だということです。しかし、私のウェブサイトのフォルダの外に接続する方法がわかりません。

PS:他の情報が必要な場合はお問い合わせください。

ベストアンサー1

私の考えでは、データを直接インポートまたは返すことをお勧めしphpます。コードも同じことができます。私の経験では、これは他のディレクトリを開いたり、ファイル権限などを使用したり変更したりするよりもはるかに優れています。pythonapacheapachesudoapache

プログラムがインターネット接続速度よりも速く大量のファイルを生成すると、プログラムが直接データをストリーミングできるため、それを管理するための追加のデータファイルとコード、およびそれを記憶するメカニズムが排除されます。

Stack Overflowに対するこの回答は、.NETでコードがどのように機能するかを示していますphphttps://stackoverflow.com/a/4357904/5484716

このように呼び出されたプログラムの場合は、すべてのstderrストリーム出力を削除し、Pythonプロセスの戻りコードがプロセスの成功または失敗を正確に反映していることを確認してください。

次の例は、popen()上記のstackoverflowの例のシナリオで使用する呼び出しを示しています。exec 2>/dev/null;シェルコマンドの前に追加しました。これにより、データがstderrすべてから来るため、stdoutデッドロックの原因となる可能性があるシェル自体でも出力は標準エラーに移動しませんpopen()

ユーザーにディスクファイルをダウンロードするには:

$fp = popen('exec 2>/dev/null; sudo -u theuser cat yourfile.zip', 'r');

アクティブプロセスからデータをダウンロードするには:

$fp = popen('exec 2>/dev/null; sudo yourpythonscript arg argN', 'r');

このコマンドラインはいこれはシェルコマンドであり、シェルメタ文字について適切に引用する必要があります。

第2の方法では、サーバは即座にデータ転送を開始する。ユーザーがフォームを正常に送信すると、ブラウザに別名で保存ダイアログボックスがすぐに表示されます。ユーザーが出力ファイルを選択すると、phpスクリプトは有線でデータをリモートファイルに直接転送します。

スクリプトpythonを印刷する必要があります。ただzip データを標準出力として返し、zip プロセスの成功または失敗を正確に示す終了コードを返します。たとえば、pythonスクリプトでは出力を作成する必要があります。sys.stdoutzf = ZipFile(sys.stdout, ...

pclose()呼び出して戻り値を確認することが重要です。、これがzipが成功したかどうかを知る唯一の方法だからです。ゼロ以外の値が返された場合はpclose()問題があります。

クライアントがファイルを処理する方法は、次の設定やresponse headersその他の設定によって異なりますcontent-type:content-encoding:content-disposition:http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html、表示response-headerおよびentity-header情報。

おすすめ記事