Come determinare la directory temporanea pubblica su OS X per essere accessibile in scrittura dal server www?

1

Ho MAMP che esegue httpd server come _www e vorrei assegnare la directory temporanea come parte dello script di shell (bash).

Ho provato a utilizzare $TMPDIR come per questi post:

tuttavia punta a /var/folders/vp/tlt7xf791gl1_v56m0xdmrph0000gn/T/ e questa cartella non ha le autorizzazioni necessarie, quindi il server Apache non può creare alcun file lì dentro.

Basato su questo:

$ /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/

Il mio utente www che mi interessa:

$ id _www
uid=70(_www) gid=70(_www) groups=70(_www),12(everyone),61(localaccounts),401(com.apple.sharepoint.group.1),100(_lpoperator)

Non posso usare /tmp , perché è collegato al mio /private/tmp (il cui nome indica che è privato).

Quindi come faccio a determinare la mia directory temporanea corretta su OS X, quindi io e il mio httpd server possiamo usarla?

Non voglio il valore dell'hardcode, in quanto lo script sarebbe inutile se usato in ambienti diversi (ad esempio in ambiente non MAMP), quindi la posizione può variare.

    
posta kenorb 14.10.2015 - 23:26
fonte

2 risposte

2

Scriverò su /tmp (che equivale a scrivere su /private/tmp ) poiché è scrivibile da tutti gli utenti e non solo dagli utenti amministrativi. È lì per la compatibilità e per i punti bonus, lo script può ripulire i file o tagliarli se diventano troppo grandi.

Non ho un riferimento autorevole al perché / private è stato chiamato così, ma è sempre stato aperto alla scrittura e non è limitato come $ TMPDIR è da utenti non amministratori.

La vera domanda è che utente stai correndo apache - un membro del gruppo ADMIN o solo un normale utente non amministratore?

Apple lo documenta nella Guida alla codifica sicura con l'ammonizione che scrivere file su posizioni pubblicamente leggibili è intrinsecamente insicuro e che è meglio posizionare i file in posizioni più protette che non siano leggibili da tutti gli utenti. Consulta la sezione Condizioni di corsa e operazioni di file sicure e questo link su creazione di file temporanei sicuri . Utilizzando mkstemp POSIX chiama per garantire che venga creato un file univoco e che possa controllare l'accesso con umask.

Stranamente (per me), mktemp quando eseguito da un utente non amministratore può ancora creare un file temporaneo in $ TMPDIR, quindi usa chiaramente i privilegi escalizzati per distribuire quel file più "sicuro" agli utenti non amministratori. Molto carino.

    
risposta data 14.10.2015 - 23:31
fonte
1

Per quanto riguarda la soluzione alternativa, ho trovato finora che il comando php può determinare la directory temporanea corretta dalla prospettiva www (assumendo che la CLI di PHP abbia le stesse impostazioni del server):

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

È anche possibile utilizzare mktemp per verificare dove vengono creati i file temporanei per un utente specifico (poiché $TMPDIR fallirebbe), ad esempio:

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

Quindi in sintesi questo potrebbe essere esteso a qualcosa di simile:

#!/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
    
risposta data 15.10.2015 - 00:11
fonte

Leggi altre domande sui tag