Tengo MAMP ejecutando httpd
un servidor como _www y me gustaría asignar el directorio temporal como parte del script de shell (bash).
He intentado usar $TMPDIR
según estas publicaciones:
sin embargo, apunta a /var/folders/vp/tlt7xf791gl1_v56m0xdmrph0000gn/T/
y esta carpeta no tiene los permisos necesarios, por lo que el servidor Apache no puede crear ningún archivo allí.
Basado en esto:
$ /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/
Mi usuario de www que me importa:
$ id _www
uid=70(_www) gid=70(_www) groups=70(_www),12(everyone),61(localaccounts),401(com.apple.sharepoint.group.1),100(_lpoperator)
No puedo usar /tmp
, porque está vinculado a mi /private/tmp
(cuyo nombre indica que es privado).
Por lo tanto, ¿cómo determino mi directorio temporal correcto en OS X, para que yo y mi httpd
servidor podamos usarlo?
No quiero codificar el valor, ya que la secuencia de comandos sería inútil cuando se usa en diferentes entornos (por ejemplo, en un entorno que no sea MAMP), por lo que la ubicación puede variar.
Escribiría a /tmp
(que es equivalente a escribir a /private/tmp
) ya que todos los usuarios pueden escribir y no solo los usuarios administrativos. Está ahí por compatibilidad y puntos de bonificación, su secuencia de comandos puede limpiar archivos o cortarlos si crecen demasiado.
No tengo una referencia autorizada de por qué /private se llamó así, pero siempre ha estado abierto a la escritura y no está restringido como $TMPDIR para usuarios que no son administradores.
La verdadera pregunta es qué usuario está ejecutando apache
: ¿un miembro del grupo ADMIN o simplemente un usuario normal que no es administrador?
Apple documenta esto en la Guía de codificación segura con la advertencia de que escribir archivos en ubicaciones de lectura pública es intrínsecamente inseguro y que es mejor colocar archivos en ubicaciones más protegidas que no puedan leer todos los usuarios. Consulte la sección Condiciones de carrera y operaciones de archivos seguros y este enlace sobre la creación de archivos temporales seguros . Al usar la llamada mkstemp POSIX, se asegura de que se cree un archivo único y pueda controlar el acceso con umask.
Curiosamente (para mí), mktemp
cuando lo ejecuta un usuario que no es administrador, aún puede crear un archivo temporal en $ TMPDIR, por lo que claramente está usando privilegios escalados para entregar ese archivo más "seguro" a usuarios que no son administradores. Muy genial.
/tmp
y bob es tu tío. Podría convertirlo en una variable, pero no tiene sentido ya que no cambia./tmp
, inicialmente estaba confundido por el enlace simbólico que tenía 0755
, pero el destino es en realidad 1777
, así que espero que funcione en todos los casos. Gracias.1777
permisos.En cuanto a la solución, hasta ahora he encontrado que php
el comando puede determinar el directorio temporal correcto desde la perspectiva de www (suponiendo que PHP CLI tiene la misma configuración que el servidor):
$ php -r "echo ini_get('upload_tmp_dir');"
/Applications/MAMP/tmp/php
También es posible usarlo mktemp
para verificar dónde se crean los archivos temporales para un usuario específico (ya que $TMPDIR
fallaría), por ejemplo:
$ sudo -uwww bash -c 'dirname $(mktemp)'
/tmp
Entonces, en resumen, esto podría extenderse a algo como:
#!/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
bmike
mmmmmm