Unter Ubuntu 18 kann mit PHP nicht auf Dateien zugegriffen oder diese kopiert werden

Unter Ubuntu 18 kann mit PHP nicht auf Dateien zugegriffen oder diese kopiert werden

Ich beschäftige mich mit einem Legacy-Projekt, bei dem eine PHP-API einen CSV-Export aus MySQL erstellt und die Datei zum späteren Download bereitstellt.

Das Problem besteht darin, dass die API die CSV-Datei nicht in das Verzeichnis kopieren kann, aus dem sie heruntergeladen werden kann (über Apache).

Der Ablauf ist wie folgt:

  1. Jemand klickt auf einer Website auf eine Schaltfläche, um einen CSV-Export zu erstellen.
  2. Die API erstellt eine SQL-Anweisung und führt sie mit shell_exec(mysql ...) aus.
  3. Die Datenbank erstellt eine CSV-Datei mit den Daten und legt sie in /tmp/ ab.
  4. Die API kopiert die Datei in ein dediziertes Download-Verzeichnis für Apache
  5. Die API sendet dem Benutzer, der auf die Schaltfläche geklickt hat, eine E-Mail mit einem Download-Link.

Alles oben genannte funktioniert, außer Schritt 4.

In der API habe ich Folgendes gefunden:

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

Wie gesagt, der MySQL-Befehl funktioniert, die E-Mail-Benachrichtigung funktioniert, aber der cp-Befehl nicht.

Wenn ich in die Protokolle schaue, sehe ich diesen Fehler:

cp: kann '/tmp/610278f414d84.csv' nicht stat: Keine solche Datei oder kein solches Verzeichnis

Ich habe auch versucht shell_exec("ls /tmp/*.csv");zu prüfen, ob die älteren Exportdateien für die API sichtbar sind, aber dann erhalte ich Folgendes:

ls: kann nicht auf „/tmp/*.csv“ zugreifen: Keine solche Datei oder kein solches Verzeichnis

Da sind definitiv CSV-Dateien drin. Daher dachte ich, es könnte ein Berechtigungsproblem sein und versuchte, dies im Terminal auszuführen: sudo -u www-data cp /tmp/610274ad5a8a5.csv /path/to/api/download. Ich habe den cp-Befehl aus den Protokollen kopiert, daher sollte es genau dasselbe sein.

Das funktioniert. Jetzt bin ich verwirrt, weil www-data Apache ausführt und ich mit shell_exec("whoami") auch www-data von der PHP-API bekomme. Vielleicht sudo -u www-data cp ...funktioniert der Befehl nicht wie erwartet (ich hatte erwartet, dieselben Berechtigungen wie dieser Benutzer zu haben). Aber ich weiß es nicht.

Weiß jemand, warum PHP nicht auf die CSV-Dateien in /tmp zugreifen und sie in ein anderes Verzeichnis kopieren kann?

Das Zielverzeichnis gehört zur Gruppe www-data und dort enthaltene Dateien können über einen Browser heruntergeladen werden.

Ich weiß, dass der Ansatz, Daten aus einer Datenbank zu exportieren, seltsam ist, aber bis vor einem Jahr schien er zu funktionieren. Jetzt ist niemand mehr von diesem Projekt in meiner Firma und ich weiß nicht, was sich geändert hat.

Antwort1

Es gibt ein privates temporäres Verzeichnis für Apache in /tmp/*apache2.service*/tmp. Dies existiert aufgrund der privaten temporären Einstellung in /lib/systemd/system/apache2.service. Ich habe ein wenig gefundenArtikel hier.

Wenn ich copy(/tmp/....)das PHP-Skript aufrufe, sucht es im Apache-spezifischen privaten temporären Verzeichnis. Apache kann den Inhalt nicht sehen, /tmpwenn diese Option aktiviert ist.

Daher kann ich diese Option nur deaktivieren oder MySQL veranlassen, die CSV-Dateien woanders zu speichern.

verwandte Informationen