Ubuntu 18 で PHP を使用してファイルにアクセスしたりコピーしたりできない

Ubuntu 18 で PHP を使用してファイルにアクセスしたりコピーしたりできない

PHP API が MySQL から CSV エクスポートを作成し、後でダウンロードするためのファイルを提供するレガシー プロジェクトを処理する必要があります。

問題は、API が CSV ファイルをディレクトリにコピーできず、そこから Apache 経由でダウンロードできないことです。

プロセスは次のようになります。

  1. 誰かがウェブサイト上のボタンをクリックして CSV エクスポートを作成します。
  2. API は SQL ステートメントを作成し、shell_exec(mysql ...); でそれを実行します。
  3. データベースはデータを含むCSVファイルを作成し、それを/tmp/に保存します。
  4. APIはファイルをApacheの専用ダウンロードディレクトリにコピーします。
  5. API は、ボタンをクリックしたユーザーにダウンロード リンクを含むメールを送信します。

上記の手順 4 を除いてすべて機能します。

API で見つけたものは次のとおりです。

$exportCommand = "mysql ....";
// mysqlExportTmpDir = /tmp
// mysqlExportTargetDirectory = download directory for apache
$moveExportFileCommand = "cp ".$this->mysqlExportTmpDir."/$filename ".$this->mysqlExportTargetDirectory;
shell_exec("( $exportCommand; $moveExportFileCommand; $sendNotificationCommand) &");

前述したように、MySQL コマンドは機能し、メール通知も機能しますが、 cp コマンドは機能しません。

ログを見ると、次のエラーが表示されます:

cp: '/tmp/610278f414d84.csv' を stat できません: そのようなファイルまたはディレクトリはありません

また、shell_exec("ls /tmp/*.csv");古いエクスポート ファイルが API に表示されるかどうかも確認しようとしましたが、次のような結果になりました。

ls: '/tmp/*.csv' にアクセスできません: そのようなファイルまたはディレクトリはありません

そこには間違いなく CSV ファイルがあります。そのため、権限の問題かもしれないと思い、ターミナルでこれを実行してみました: sudo -u www-data cp /tmp/610274ad5a8a5.csv /path/to/api/download。ログから cp コマンドをコピーしたので、まったく同じになるはずです。

それはうまくいきました。www-data は Apache を実行し、shell_exec("whoami") を使用すると PHP API からも www-data を取得するので、今私は混乱しています。コマンドがsudo -u www-data cp ...期待どおりに動作しないのかもしれません (そのユーザーと同じ権限を持っていると期待していました)。しかし、わかりません。

PHP が /tmp 内の csv ファイルにアクセスできず、別のディレクトリにコピーできない理由を誰か知っていますか?

ターゲット ディレクトリは www-data グループに属しており、そこにあるファイルはブラウザーからダウンロードできます。

データベースからデータをエクスポートするアプローチは奇妙だとわかっていますが、1年前まではうまくいっていたようです。現在、このプロジェクトに携わった人は会社に誰もおらず、何が変わったのかわかりません。

答え1

Apacheのプライベートtmpディレクトリが にあります/tmp/*apache2.service*/tmp。これは のプライベートtmp設定により存在します/lib/systemd/system/apache2.service。私は少し記事はこちら

copy(/tmp/....)PHP スクリプトを呼び出すたびに、 Apache 固有のプライベート tmp ディレクトリが検索されます。/tmpこのオプションを有効にすると、Apache はその内容を見ることができません。

したがって、このオプションを無効にするか、MySQL に CSV ファイルを別の場所にダンプさせるしかありません。

関連情報