Wie kann festgelegt werden, dass das öffentliche Temp-Verzeichnis unter OS X für den WWW-Server schreibbar ist?

Ich habe MAMP-Server als _www ausgeführt httpdund möchte das temporäre Verzeichnis als Teil des Shell-Skripts (bash) zuweisen.

$TMPDIRIch habe versucht , gemäß diesen Beiträgen zu verwenden :

Es zeigt jedoch auf /var/folders/vp/tlt7xf791gl1_v56m0xdmrph0000gn/T/und dieser Ordner verfügt nicht über die erforderlichen Berechtigungen, sodass der Apache-Server dort keine Dateien erstellen kann.

Basierend auf:

$ /usr/bin/stat -F $TMPDIR /tmp /private/tmp 
drwx------ 104 kenorb staff 3536 Oct 14 22:21:05 2015 /var/folders/vp/tlt7xf791gl1_v56m0xdmrph0000gn/T//
lrwxr-xr-x 1 root wheel 11 Apr  9 13:08:03 2014 /tmp@ -> private/tmp
drwxrwxrwt 112 root wheel 3808 Oct 14 22:12:04 2015 /private/tmp/

Mein WWW-Benutzer, der mir wichtig ist:

$ id _www
uid=70(_www) gid=70(_www) groups=70(_www),12(everyone),61(localaccounts),401(com.apple.sharepoint.group.1),100(_lpoperator)

Ich kann nicht verwenden /tmp, da es mit meinem verknüpft ist /private/tmp(dessen Name besagt, dass es privat ist).

Wie bestimme ich also mein richtiges temporäres Verzeichnis unter OS X, damit ich und mein httpdServer es verwenden können?

Ich möchte den Wert nicht fest codieren, da das Skript in verschiedenen Umgebungen (z. B. in einer Nicht-MAMP-Umgebung) nutzlos wäre, sodass der Speicherort variieren kann.

Machen Sie sich Sorgen, /private soll nur die üblichen Verzeichnisse vor / "verstecken" und nicht bedeuten, dass Sie dort keine Dateien speichern können. Es ist besser, $TMPDIR anstelle von /tmp zu verwenden, aber das Schreiben in /tmp ist unter OS X im Allgemeinen in Ordnung, wenn Sie diesen festen Pfad bevorzugen ...
Der Punkt von $TMPDIR in /var/... ist, dass es die richtigen Berechtigungen hat - also für welche Benutzer ist das Verzeichnis geöffnet und als welcher Benutzer wird das Skript ausgeführt? - private just ist ein historischer Wert, sodass sich das Betriebssystem auf einem schreibgeschützten Dateisystem befinden kann, und /private ist ein Mount für ein lokales Dateisystem, in das geschrieben werden kann

Antworten (2)

Ich würde an schreiben /tmp(was dem Schreiben an entspricht /private/tmp), da alle Benutzer und nicht nur Administratoren darauf schreiben können. Es ist aus Gründen der Kompatibilität und für Bonuspunkte da, Ihr Skript kann Dateien bereinigen oder sie ausschneiden, wenn sie zu groß werden.

Ich habe keinen maßgeblichen Hinweis darauf, warum /private so genannt wurde, aber es war immer offen für das Schreiben und ist nicht wie $TMPDIR von Nicht-Admin-Benutzern eingeschränkt.

Die eigentliche Frage ist, welchen Benutzer Sie ausführen apache- ein Mitglied der ADMIN-Gruppe oder nur ein normaler Benutzer ohne Administratorrechte?

Apple dokumentiert dies im Secure Coding Guide mit der Ermahnung, dass das Schreiben von Dateien an öffentlich lesbare Orte von Natur aus unsicher ist und dass es besser ist, Dateien an geschützteren Orten zu platzieren, die nicht für alle Benutzer lesbar sind. Weitere Informationen zum Erstellen sicherer temporärer Dateien finden Sie im Abschnitt Race Conditions und sichere Dateioperationen und unter diesem Link . Durch die Verwendung des POSIX-Aufrufs mkstemp stellen Sie sicher, dass eine eindeutige Datei erstellt wird, und können den Zugriff mit umask steuern.

Seltsamerweise (für mich) mktempkann, wenn es von einem Nicht-Admin-Benutzer ausgeführt wird, immer noch eine temporäre Datei in $TMPDIR erstellt werden, sodass eindeutig eskalierte Berechtigungen verwendet werden, um diese "sicherere" Datei an Nicht-Admin-Benutzer zu übergeben. Ziemlich cool.

Gibt es eine Variable oder Funktion, mit der dieser Ordner bestimmt werden kann? Oder muss ich bedingt tun?
@kenorb - welcher Ordner? - $TMPDIR ist die Variable, die den temporären Ordner angibt (auch TMPDIR ist für alle Benutzer, jeder Benutzer hat einen anderen / tmp wird gemeinsam genutzt, sodass Konflikte zwischen Benutzern auftreten)
@kenorb schreibe an den Pfad /tmpund Bob ist dein Onkel. Sie könnten es zu einer Variablen machen, aber es hat keinen Sinn, da es sich nicht ändert.
Ich denke, es wird einfacher zu verwenden sein /tmp, anfangs war ich verwirrt von dem symbolischen Link, der 0755darauf stand, aber das Ziel ist eigentlich 1777, also hoffe ich, dass es in allen Fällen funktioniert. Danke.
Sie können /tmp oder /private/tmp nicht ändern, aber alle Benutzer können dort schreiben. Unsicher, aber es erledigt die Arbeit mit wenig Durcheinander oder Aufhebens. Sie sind mit den Berechtigungen dran 1777.

Als Problemumgehung habe ich bisher festgestellt, dass dieser phpBefehl das richtige temporäre Verzeichnis aus der WWW-Perspektive bestimmen kann (vorausgesetzt, die PHP-CLI hat dieselben Einstellungen wie der Server):

$ php -r "echo ini_get('upload_tmp_dir');"
/Applications/MAMP/tmp/php

Es ist auch möglich, zu prüfen mktemp, wo die temporären Dateien für bestimmte Benutzer erstellt werden (was $TMPDIRfehlschlagen würde), z.

$ sudo -uwww bash -c 'dirname $(mktemp)'
/tmp

Zusammenfassend könnte dies also erweitert werden zu etwas wie:

#!/usr/bin/env bash
WWW_USER="$(ps axo user,group,comm | egrep "(apache|httpd)" | grep -v ^root | uniq | cut -d\  -f 1)"
PHP="$(which php)"

if [ -n "$PHP" ]; then
  TMP="$(php -r "echo ini_get('upload_tmp_dir');")"
elif [ -n "$WWW_USER" ]; then
  TMP="$(sudo -uwww bash -c 'dirname $(mktemp)')"
elif [ -n "$TMPDIR" ]; then
  TMP="$TMPDIR"
else
  TMP="/tmp"
fi