Belirli bir klasör için umask nasıl ayarlanır


23

Bazı açık nedenlerden dolayı umaskbelirli bir klasör için değer ayarlamam gerekiyor . İnsan bunu nasıl yapabilir?

Şimdiden teşekkürler!

GÜNCELLEME 1

Belirli bir klasör için umask kullanmamın nedeni şu şekilde. Bir web uygulamasına sahibim ve bir dosya oluşturduğunda varsayılan izin 700'dür. Ancak bu dosya için en az 755 izne ihtiyacım var. Sanırım şimdi sorunu daha net bir şekilde açıklayabilirim.


1
Nedenler sizin için açık olabilir, ama bizim için değil. Lütfen ne yapmak istediğinizi paylaşın.
htorque

@htorque. Özel sorunumda umask kullanmamın nedeni eklendi.
Bakhtiyor

Yanıtlar:


30

kullanabilirsin setfacl

setfacl -d -m group:name:rwx /path/to/your/dir

nameGrup ismi nerede

Sizin veya belirli bir kullanıcının hangi gruplara ait olduğunu bulmak için bkz . Unix / linux'da verilen bir kullanıcının hangi grupta komut satırı olduğunu nasıl öğrenirsiniz?


1
Belki setfaclde değişti. -mGeçerli bir seçenek olmadığını belirten bir hata alıyorum .
Ryan Burnette

Ryan setfacldeğişmedi. Büyük olasılıkla (sonradan -m) uygun bir grup adı girmediniz .
sergk

1
Oldukça eminim erişim kontrol listelerisetfacl için değil . Daha iyi bir çözüm ama aslında ne istendi, sanmıyorum. umask
Wyatt8740

deneyin: sudo setfacl -Rdm ...(özyineleme için R'yi atlayın) çalışmalıdır. @ Wyatt8740 (doğru). Emin olmak için:, man setfaclve yazın /-modify. Kullanman gerek sudo.
NİSAN,

11

Dizin başına umask ayarlayamazsınız, bu işlem düzeyinde bir değerdir. Başkalarının bir dizindeki dosyaları okumasını önlemeniz gerekirse, ilgili izin bitlerini iptal edin.

Örneğin, /home/user/directorybir işlemden 777 gibi izinler alabilen bazı dosya ve dizinleri olan bir dizininiz varsa , izin bitlerini /home/user/directory700 gibi bir şeye ayarlayın. Bu, diğer kullanıcıların (süper kullanıcı kökü hariç) inmesini imkansız hale getirir içinde /home/user/directory.

Paranoyak oluyorum ve izinleri /home/user750'ye ayarlıyorum , bu yüzden sadece ev dizinimde okuyabilir, yazabilir ve inebilirim. Bunun bir sonucu olarak, benzeri klasörlere /home/user/Publicbaşkaları tarafından erişilemiyor, ancak bununla yaşayabilirim.


Sorunuzun güncellemesi başına: Yine de, dosya sisteminde (şiddetle tavsiye edilen FAT gibi farklı bir dosya sistemi kullanmak dışında) web uygulamanızda bunu yapmanız gerektiğini kontrol edemezsiniz. Webapp'iniz PHP ile kodlanmışsa, umaskişlevi kullanarak anında umask'ı değiştirebilirsiniz :

<?php
umask(0022);
// other code
?>

Bunu, veritabanı bağlantı şifresini içeren dosya gibi (Wordpress gibi uygulamalarda düşünerek) bir yapılandırma dosyasına koyabilirsiniz.

Bunun bir işlem değeri olduğunu unutmayın, bazı web sunucuları yapılandırma dosyalarında ayarlamanıza izin verir, aksi takdirde başlangıç ​​kodlarını istediğiniz umask'ı ayarlayacak şekilde değiştirebilirsiniz. İzinleri gibi unutmayın 755ve 644kod duyarlı ise, herkes okuyabilir, webapps için oldukça tehlikelidir.


Bunun eski olduğunu biliyorum, ancak bahsetmeye değer olduğunu düşünüyorum: yönetici üst dizin izinleri sorunu etrafında çalışmak için mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) 'ı bağlayabilir .
Adrian Günter,

1

Bir klasörün izinlerini değiştirmek için chmod kullanın. umask dosyalar içindir.

Umask’a ihtiyacınız olanı ayarlayın

umask xxx

ve yaptığın zaman geri dön

umask 022

11
umask = dosyalar ve dizinler, fmask = sadece dosyalar, dmask = sadece dizinler. : P
htorque

1
Bugün yeni bir şey öğrendim :)
wojox

1
Aslında bu, NTFS gibi belirli dosya sistemleri için seçeneklerdir (bu dosya oluşturma maskesi ayar komutu değil umask). Kafa karıştırıcı bilgi eklediğim için üzgünüm.
htorque

umask, farklı bir açık kabuk veya kullanıcının sahip olduğu bir işleminiz varsa, geçerli işlem için dosya oluşturma maskesini (geçerli kabuk) değiştirir, etkileneceğine inanmıyorum. Bu komut siz değiştirene kadar dizinin dışında oluşturulan diğer dosyaları da etkileyecektir.
Dave,

1

Başka bir çözüm, grup kimliğini, dizinde oluşturulan dosyalara ayarlamaktır, bu da yeni dosyaları, dosyaları oluşturan kullanıcının grup kimliği yerine dizin grup kimliğine aittir. Yani sadece yapabileceğini düşünüyorum:

chown www-data:www-data /my/folder

chmod 4755 /my/folder

Bu, setgid özel dosya iznini belirler; bu, yaratılan tüm dosyaların gruba /my/folderait olmasına neden olur www-data; bu, üst dizinden dolayı rx (5) iznine sahiptir.


2
GUID'i SUID sekizli değeriyle karıştırdınız
adampski

1

Kabuk kancası ve ile uygulanan anter çözeltisini sağlar direnv. Sisteminizde setfaclmevcut değilse, aşağıdaki çözüm daha uyumlu olabilir . (örneğin, macOS)

direnvkabuk için bir ortam değiştiricisidir. Geçerli dizine bağlı olarak ortam değişkenlerini yüklemek veya boşaltmak için bash, zsh, tcsh, fish shell ve elvish'e nasıl bağlanacağını bilir .

Belirli bir dizin .envrciçin exportözel umaskdeğer kullanın ve exportbu dizini bıraktığınızda ed env var kaldırılır.

# example .envrc file
export UMASK=0022

umaskÇalışma dir değiştirildikten sonra değeri değiştirmek için bir kanca tanımlayın .

function _umask_hook {
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  elif [[ $OSTYPE == darwin* ]]; then
    umask 0077
  else
    umask 0022
  fi
}

# To make the code more reliable on detecting the default umask
function _umask_hook {
  # Record the default umask value on the 1st run
  [[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"

  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  else
    umask "$DEFAULT_UMASK"
  fi
}

# zsh hooks
# trigger _umask_hook once working dir is changed
add-zsh-hook chpwd _umask_hook

# bash
# Append `;` if PROMPT_COMMAND is not empty
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}_umask_hook"

Şimdilik, zsh için direniş kancasının başlatılması chpwdkancayı desteklemiyor . Çekme talebi GH-514 , bu sayfayı gördüğünüzde birleştirilmemiştir. Dışarı yorum yapın eval "$(direnv hook zsh)"ve kanca direnvüzerinde chpwdelle kod aşağıdaki ile,

if (( $+commands[direnv] )) && ! (( $+functions[_direnv_hook] )); then
  _direnv_hook() {
    eval "$(command "direnv" export zsh)";
  }
  typeset -agU precmd_functions;
  if [[ -z ${precmd_functions[(r)_direnv_hook]} ]]; then
    precmd_functions=( _direnv_hook ${precmd_functions[@]} )
  fi

  typeset -agU chpwd_functions;
  if [[ -z ${chpwd_functions[(r)_direnv_hook]} ]]; then
    chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
  fi
fi

Kaynak: dynamic-umask-based-on-cwd.md


0

İlgili, ancak bu durumda geçerli olmayabilir, aşağıdaki klip .zshrc:

# Change the umask automatically for some directories; use 0022 as the default
chpwd () {
    case $PWD in
        $HOME/[Dd]ocuments*)
            if [[ $(umask) -ne 077 ]]; then
                umask 0077
                echo -e "\033[01;32mumask: private \033[m"
            fi;;
        */[Ww]eb*)
            if [[ $(umask) -ne 072 ]]; then
                umask 0072
                echo -e "\033[01;33mumask: other readable \033[m"
            fi;;
        /vol/nothing)
            if [[ $(umask) -ne 002 ]]; then
                umask 0002
                echo -e "\033[01;35mumask: group writable \033[m"
            fi;;
        *)
            if [[ $(umask) -ne 022 ]]; then
                umask 0022
                echo -e "\033[01;31mumask: world readable \033[m"
            fi;;
    esac
}

Bu nedenle etkileşimli kullanım için, bunun gibi bir şey işe yarayabilir (ancak açık bir şekilde güvenlik sağlamak değil).

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.