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

1

He ejecutado MAMP httpd server 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 puedo determinar mi directorio temporal correcto en OS X, para que yo y mi servidor httpd puedan usarlo?

No quiero un valor de código duro, 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.

    
pregunta kenorb 14.10.2015 - 23:26

2 respuestas

2

Escribiría a /tmp (lo que equivale a escribir a /private/tmp ), ya que todos los usuarios pueden escribir y no solo los usuarios administrativos. Está ahí por compatibilidad y por puntos de bonificación, su script puede limpiar archivos o cortarlos si crecen demasiado.

No tengo una referencia autorizada de por qué / private se llamaba así, pero siempre ha estado abierto a la escritura y no está restringido, ya que $ TMPDIR es de usuarios que no son administradores.

La pregunta real es: ¿qué usuario está ejecutando apache - un miembro del grupo ADMIN o simplemente un usuario normal no administrador?

Apple lo documenta en la Guía de codificación segura con la advertencia de que escribir archivos en ubicaciones de lectura pública es intrínsecamente insegura y que es mejor colocar los archivos en ubicaciones más protegidas que no puedan ser leídas por todos los usuarios. Consulte la sección Condiciones de carrera y Operaciones de archivo seguro y este enlace en crear archivos temporales seguros . Usando el mkstemp llamada POSIX, se asegura de que se cree un archivo único y pueda controlar el acceso con umask.

Por extraño que parezca (para mí), mktemp cuando lo ejecuta un usuario que no es administrador aún puede crear un archivo temporal en $ TMPDIR, por lo que está claramente usando privilegios escalados para entregar ese archivo más "seguro" a los usuarios que no son administradores. Muy genial.

    
respondido por el bmike 14.10.2015 - 23:31
1

En cuanto a la solución, he encontrado hasta ahora que el comando 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 usar 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

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
    
respondido por el kenorb 15.10.2015 - 00:11

Lea otras preguntas en las etiquetas