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

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

He intentado usar $TMPDIRsegú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 httpdservidor 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.

¿Le preocupa que /private sea solo "ocultar" los directorios habituales de / y no significa que no pueda almacenar archivos allí? Es mejor usar $TMPDIR en lugar de /tmp, pero escribir en /tmp generalmente está bien en OS X si prefiere usar esa ruta fija...
El punto de que $TMPDIR esté en /var/... es que tiene los permisos correctos, entonces, ¿para qué usuarios está abierto el directorio y con qué usuario se ejecuta el script? - private solo es histórico para que el sistema operativo pueda estar en un sistema de archivos de solo lectura y /private es un montaje en un sistema de archivos local en el que se puede escribir

Respuestas (2)

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í), mktempcuando 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.

¿Hay alguna variable o función que pueda usarse para determinar esa carpeta? O tengo que hacer condicionalmente?
@kenorb: ¿qué carpeta? - $TMPDIR es la variable que da la carpeta temporal (también TMPDIR es para todos los usuarios cada usuario tiene uno diferente /tmp se comparte por lo que hay conflictos entre usuarios)
@kenorb escribe en el camino /tmpy bob es tu tío. Podría convertirlo en una variable, pero no tiene sentido ya que no cambia.
Creo que será más fácil de usar /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.
No puede cambiar /tmp o /private/tmp pero todos los usuarios pueden escribir allí. Inseguro, pero hace el trabajo con poco desorden o alboroto. Estás en ello con los 1777permisos.

En cuanto a la solución, hasta ahora he encontrado que phpel 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 mktemppara verificar dónde se crean los archivos temporales para un usuario específico (ya que $TMPDIRfallarí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