OS X üzerindeki genel geçici dizinin, www sunucusu tarafından yazmaya erişilebilir olması nasıl belirlenir?


1

MAMP çalışıyor httpd Sunucu _www olarak ve geçici dizini kabuk betiğinin (bash) bir parçası olarak atamak istiyorum.

Kullanmaya çalıştım $TMPDIR bu yayınlara göre:

ancak işaret eder /var/folders/vp/tlt7xf791gl1_v56m0xdmrph0000gn/T/ ve bu klasör gerekli izinlere sahip değildir, bu nedenle Apache sunucusu orada herhangi bir dosya oluşturamaz.

Buna göre:

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

İlgilendiğim www kullanıcısı:

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

Kullanamam /tmp, çünkü benim bağlantılı /private/tmp (hangi isim özel olduğunu belirtir).

Bu nedenle, doğru geçici dizini OS X'te nasıl belirleyebilirim? httpd sunucu kullanabilir?

Farklı ortamlarda (örneğin MAMP dışı ortamlarda) kullanıldığında komut dosyası işe yaramayacağından, kodun değerini değiştirmek istemiyorum, böylece konum değişebilir.


1
Endişeli misiniz / özel sadece sıradan dizinleri "gizlemek" / orada dosyaları saklayamayacağınız anlamına gelmez. / Tmp yerine $ TMPDIR kullanmak daha iyidir, ancak bu sabit yolu kullanmayı tercih ederseniz / tmp'ye yazmak genellikle OS X'te iyidir ...
bmike

$ TMPDIR / var / ... 'ın amacı, doğru izinlere sahip olmasıdır - yani dizin hangi kullanıcılar için açık ve komut dosyası hangi kullanıcı olarak çalışıyor? - Özel kullanım tarihi bir sistemdir, böylece işletim sistemi salt okunur bir dosya sisteminde olabilir ve / private yazılabilir yerel bir dosya sistemine bağlanır.
Mark

Yanıtlar:


2

Ben yazarım /tmp (yazmaya eşdeğerdir) /private/tmp ) yalnızca yönetici kullanıcılar tarafından değil, tüm kullanıcılar tarafından yazılabilir olduğundan. Uyumluluk için var ve bonus puanları için, komut dosyanız dosyaları temizleyebilir veya çok büyüyerse kesebilir.

Neden / private'nin çağrıldığına dair yetkili bir referansım yok, ancak her zaman yazıma açık ve $ TMPDIR yönetici olmayan kullanıcılardan olduğu gibi sınırlı değil.

Asıl soru, hangi kullanıcıyı çalıştırıyorsunuz? apache - ADMIN grubunun bir üyesi mi, yoksa normal yönetici olmayan bir kullanıcı mı?

Apple bu konuda belgeler Güvenli Kodlama Kılavuzu herkese açık olarak okunabilen konumlara dosya yazmanın kendiliğinden güvensiz olması ve dosyaları tüm kullanıcılar tarafından okunamayan daha korumalı konumlara yerleştirmenin daha iyi olduğu önerisiyle. Bakın Yarış Koşulları ve Güvenli Dosya İşlemleri bölüm ve bu bağlantı güvenli geçici dosyalar oluşturma . Kullanarak Eğer işlev POSIX araması size benzersiz bir dosya oluşturulduğundan ve umask ile erişimi kontrol ettiğinden emin olmanızı sağlar.

İşin garibi (bana) mktemp Yönetici olmayan bir kullanıcı tarafından çalıştırıldığında yine de $ TMPDIR içerisinde geçici bir dosya oluşturabilir, bu yüzden yönetici olmayan kullanıcılara bu "daha güvenli" dosyayı vermek için artan ayrıcalıkları kullanıyor. Oldukça havalı.


Bu klasörü belirlemek için kullanılabilecek herhangi bir değişken veya işlev var mı? Yoksa şartlı olarak mı yaparım?
kenorb

@kenorb - hangi klasör? - $ TMPDIR geçici klasörü veren değişkendir (ayrıca TMPDIR, her kullanıcının farklı bir / tmp paylaşımına sahip olduğu tüm kullanıcılar içindir, böylece kullanıcılar arasında çakışma vardır)
Mark

@ kenorb yola yaz /tmp Bob senin amcan. Değişken yapabilirsin, ama değişmemesi gereken bir nokta yok.
bmike

1
Kullanımı daha kolay olacağını düşünüyorum /tmp, başlangıçta, benim sahip olduğum sembolik bağ ile karıştırıldım. 0755 Üzerinde, ancak hedef aslında 1777, umarım her durumda işe yarar. Teşekkürler.
kenorb

/ Tmp veya / private / tmp ayarını değiştiremezsiniz, ancak tüm kullanıcılar oraya yazabilir. Güvensiz, ancak işi biraz karışıklık veya telaşla halleder. Sen onunla üzerinde 1777 izinleri.
bmike

1

Geçici çözüm gelince, şimdiye kadar buldum php komutu, doğru geçici dizini www perspektifinden belirleyebilir (PHP CLI’nin sunucu ile aynı ayarları):

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

Kullanmak da mümkündür mktemp geçici dosyaların belirli bir kullanıcı için nerede oluşturulduğunu kontrol etmek $TMPDIR başarısız olur), örneğin:

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

Dolayısıyla, özet olarak bu, şöyle bir şeye genişletilebilir:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.