Ich habe MAMP-Server als _www ausgeführt httpd
und möchte das temporäre Verzeichnis als Teil des Shell-Skripts (bash) zuweisen.
$TMPDIR
Ich 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 httpd
Server 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.
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) mktemp
kann, 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.
/tmp
und Bob ist dein Onkel. Sie könnten es zu einer Variablen machen, aber es hat keinen Sinn, da es sich nicht ändert./tmp
, anfangs war ich verwirrt von dem symbolischen Link, der 0755
darauf stand, aber das Ziel ist eigentlich 1777
, also hoffe ich, dass es in allen Fällen funktioniert. Danke.1777
.Als Problemumgehung habe ich bisher festgestellt, dass dieser php
Befehl 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 $TMPDIR
fehlschlagen 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
Fahrrad
mmmmmm