1 votos

¿Cómo determinar el directorio temporal público en OS X para que sea accesible a la escritura por el servidor www?

Tengo MAMP funcionando httpd servidor como _www y me gustaría asignar el directorio temporal como parte del shell script (bash).

He intentado utilizar $TMPDIR según estos puestos:

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 la 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 puedo determinar mi directorio temporal correcto en OS X, por lo que yo y mi httpd servidor puede utilizarlo?

No quiero codificar el valor, ya que el script sería inútil cuando se utiliza en diferentes entornos (por ejemplo, en el entorno no-MAMP), por lo que la ubicación puede variar.

3voto

Oskar Puntos 1242

Yo escribiría a /tmp (lo que equivale a escribir en /private/tmp ) ya que es escribible por todos los usuarios y no sólo por los usuarios administrativos. Está ahí por compatibilidad y por puntos extra, su script puede limpiar los 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 lo está $TMPDIR para los usuarios que no son administradores.

La verdadera pregunta es qué usuario está ejecutando apache - ¿un miembro del grupo ADMIN o sólo un usuario normal no administrador?

Apple lo documenta en el 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 los archivos en ubicaciones más protegidas que no sean legibles por todos los usuarios. Ver el Condiciones de carrera y operaciones de archivo seguras y este enlace en creación de archivos temporales seguros . Utilizando el mkstemp La llamada POSIX asegura la creación de un único archivo y puede controlar el acceso con umask.

Curiosamente (para mí), mktemp cuando es ejecutado por un usuario que no es administrador, todavía puede hacer un archivo temporal en $TMPDIR, así que claramente está usando privilegios escalados para entregar ese archivo más "seguro" a los usuarios que no son administradores. Bastante bien.

1voto

matthew k Puntos 11

En cuanto a la solución, he encontrado hasta ahora que php puede determinar el directorio temporal correcto desde la perspectiva de www (asumiendo 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 utilizar mktemp para comprobar dónde se crean los archivos temporales para un usuario específico (como $TMPDIR fallaría), por ejemplo

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

Así que, en resumen, esto podría ampliarse a algo así:

#!/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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X