¿Cómo se determina que el directory público de temp en OS X sea accesible por escritura por el server de www?

Tengo MAMP ejecutando el server httpd como _www y me gustaría asignar el directory temporal como parte del script de shell (bash).

Intenté usar $TMPDIR según estas publicaciones:

  • Creando un script que ejecutará un progtwig y si sale sin chocar, lo ejecutará nuevamente
  • No se pueden instalar las herramientas de command-line de Xcode en Mountain Lion
  • ¿Cómo instalo freno de mano cli?
  • ¿Cómo forzar a los elementos de una window a estar bien formados, como en Windows?
  • El command por lotes para cambiar la date de creación de cada file para que coincida con la información en el nombre del file
  • ¿Por qué el nombre de host en el intérprete de commands del shell es "MacBook-2" en lugar de "MacBook"?
    • ¿Cómo encuentro el directory 'temp' en Linux?
    • ¿Dónde está la carpeta Temp en OS X?

    sin embargo, apunta a /var/folders/vp/tlt7xf791gl1_v56m0xdmrph0000gn/T/ y esta carpeta no tiene los permissions necesarios, por lo que el server Apache no puede crear ningún file 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 directory temporal correcto en OS X, así que mi server httpd y yo podemos usarlo?

    No quiero codificar el valor, ya que la secuencia de commands sería inútil cuando se utiliza en diferentes entornos (por ejemplo, en un entorno que no es MAMP), por lo que la location puede variar.

  • ¿Cuál es el propósito de ~ / Library / Containers?
  • El keyboard numérico produce resultados extraños en ciertos commands en Terminal
  • Errores extraños en system.log al intentar ejecutar .kext
  • Restauración de la configuration de la window para las configuraciones del monitor
  • Procesos realizados durante la installation de MacOS
  • Mac Mavericks 10.9 Problema de DNS con direcciones específicas
  • 2 Solutions collect form web for “¿Cómo se determina que el directory público de temp en OS X sea accesible por escritura por el server de www?”

    Escribiría en /tmp (que es equivalente a escribir en /private/tmp ) ya que todos los usuarios pueden escribirlo y no solo los usuarios administrativos. Está ahí para compatibilidad y puntos de bonificación, su secuencia de commands puede limpiar files o cortarlos si crecen demasiado.

    No tengo una reference autorizada de por qué / private se llamó así, pero siempre ha estado abierto para escribir y no está restringido, como $ TMPDIR es de usuarios que no son administradores.

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

    Apple documenta esto en la Guía de encoding segura con la advertencia de que escribir files en ubicaciones de lectura pública es intrínsecamente inseguro y que es mejor colocar los files en ubicaciones más protegidas que no son leíbles por todos los usuarios. Consulte la sección Condiciones de carrera y Operaciones seguras de files y este enlace para crear files temporales seguros . Al usar la llamada POSIX de mkstemp, se asegura de que se cree un file único y puede controlar el acceso con umask.

    Curiosamente (para mí), mktemp cuando lo ejecuta un usuario que no es administrador todavía puede crear un file temporal en $ TMPDIR, por lo que está utilizando claramente privilegios escalados para transferir ese file más "seguro" a usuarios que no son administradores. Muy genial.

    En cuanto a la solución, hasta ahora he encontrado que el command php puede determinar el directory temporal correcto desde la perspectiva www (suponiendo que la CLI de PHP tenga la misma configuration que el server):

     $ php -r "echo ini_get('upload_tmp_dir');" /Applications/MAMP/tmp/php 

    También es posible utilizar mktemp para verificar dónde se crean los files temporales para un usuario específico (como $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 
    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).