Cara mengatur umask untuk folder tertentu

23

Untuk beberapa alasan yang jelas saya perlu menetapkan umasknilai untuk satu folder tertentu. Bagaimana seseorang bisa melakukan itu?

Terimakasih sebelumnya!

PEMBARUAN 1

Alasan saya perlu menggunakan umask untuk folder tertentu adalah sebagai berikut. Saya memiliki aplikasi web dan ketika itu membuat beberapa file izin default adalah 700. Tapi saya memerlukan setidaknya 755 izin untuk file itu. Saya pikir saya bisa menjelaskan masalahnya dengan lebih jelas sekarang.

Bakhtiyor
sumber
1
Alasannya mungkin jelas bagi Anda, tetapi tidak bagi kami. Silakan bagikan apa yang ingin Anda lakukan.
htorque
@tortor. Menambahkan alasan mengapa saya perlu menggunakan umask dalam masalah khusus saya.
Bakhtiyor

Jawaban:

30

Anda bisa menggunakannya setfacl

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

Di mana namenama grup

Untuk menemukan grup yang Anda atau pengguna tertentu miliki, lihat Di unix / linux bagaimana Anda mengetahui grup apa yang diberikan pengguna melalui baris perintah?

yogi70
sumber
1
Mungkin setfaclsudah berubah. Saya menerima pesan kesalahan yang -mbukan pilihan yang valid.
Ryan Burnette
Ryan, setfacltidak berubah. Kemungkinan besar Anda belum memberikan nama grup yang tepat (setelah -m).
sergk
1
cukup yakin setfacluntuk daftar kontrol akses dan bukan umask. Solusi yang lebih baik tetapi tidak benar-benar apa yang diminta, saya tidak berpikir.
Wyatt8740
coba: sudo setfacl -Rdm ...(Abaikan R untuk rekursi) harus bekerja. @ Wyatt8740 (benar). Untuk menjalankan tertentu:, man setfacldan ketik /-modify. Anda harus menggunakan sudo.
JREAM
11

Anda tidak dapat menetapkan umask per direktori, ini adalah nilai tingkat proses. Jika Anda perlu mencegah orang lain membaca file di direktori, cabut bit izin yang sesuai.

Misalnya, jika Anda memiliki direktori /home/user/directorydengan beberapa file dan direktori yang bisa mendapatkan izin seperti 777 dari suatu proses, atur bit izin /home/user/directorymenjadi sekitar 700. Itu akan membuat mustahil bagi pengguna lain (tidak termasuk root superuser) untuk turun di /home/user/directory.

Saya paranoid dan mengatur izin /home/userke 750, jadi hanya saya yang bisa membaca, menulis, dan turun di direktori home saya. Ini memiliki konsekuensi bahwa folder seperti /home/user/Publictidak dapat diakses oleh orang lain, tetapi saya bisa hidup dengan itu.


Per pembaruan pertanyaan Anda: masih, Anda tidak dapat mengontrolnya di sistem file (selain menggunakan jenis sistem file yang berbeda seperti FAT yang sangat tidak jelas), Anda perlu melakukannya di aplikasi web Anda. Jika aplikasi web Anda dikodekan dalam PHP, Anda dapat mengubah umask on the fly menggunakan umaskfungsi:

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

Anda bisa meletakkan ini di file konfigurasi, seperti file yang berisi kata sandi koneksi database (berpikir di aplikasi seperti Wordpress).

Ingat bahwa ini adalah nilai proses, beberapa server web memungkinkan Anda untuk mengaturnya dalam file konfigurasi mereka, jika tidak, Anda dapat memodifikasi skrip startup untuk mengatur umask yang diinginkan. Ingatlah bahwa izin suka 755dan 644cukup berbahaya untuk webapps, jika kodenya sensitif, semua orang bisa membacanya.

Lekensteyn
sumber
Saya tahu ini kuno, tetapi saya pikir itu layak disebutkan: administrator dapat mengikat mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) untuk bekerja di sekitar masalah izin direktori induk.
Adrian Günter
1

Untuk mengubah izin untuk suatu folder gunakan chmod. umask untuk file.

Tetapkan umask sesuai kebutuhan Anda

umask xxx

dan ubah kembali setelah selesai

umask 022
wojox
sumber
11
umask = file dan direktori, fmask = hanya file, dmask = hanya direktori. : P
htorque
1
Saya belajar sesuatu yang baru hari ini :)
wojox
1
Sebenarnya itu adalah opsi untuk sistem file tertentu seperti NTFS (bukan perintah pembuatan topeng pengaturan file umask). Maaf telah menambahkan informasi yang membingungkan.
htorque
umask mengubah topeng pembuatan file untuk proses saat ini (shell saat ini), jika Anda memiliki shell yang terbuka atau proses yang dimiliki pengguna, saya tidak percaya itu akan terpengaruh. Perintah ini juga akan memengaruhi file lain yang dibuat di luar direktori hingga Anda mengubahnya kembali.
Dave
1

Solusi lain mungkin hanya dengan mengatur id grup pada file yang dibuat dalam direktori, yang membuat file baru dimiliki oleh id grup direktori, bukan id grup pengguna yang membuat file. Jadi saya pikir Anda bisa melakukan:

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

chmod 4755 /my/folder

Ini menetapkan izin file khusus setgid, yang akan menyebabkan semua file yang dibuat /my/folderdimiliki oleh www-datagrup, yang kemudian memiliki izin rx (5) karena direktori induk.

Bastiaan
sumber
2
Anda salah mengira GUID untuk nilai oktal SUID
adampski
1

Memberikan solusi anther diimplementasikan dengan kait dan shelldirenv . Solusi berikut mungkin lebih kompatibel jika setfacltidak tersedia di sistem Anda. (mis. macOS)

direnvadalah pengalih lingkungan untuk shell. Ia tahu cara menghubungkan ke bash, zsh, tcsh, fish shell dan elvish untuk memuat atau membongkar variabel lingkungan tergantung pada direktori saat ini .

Gunakan .envrcuntuk nilai exportkhusus umaskuntuk dir tertentu, dan exported env var akan diturunkan ketika Anda meninggalkan dir itu.

# example .envrc file
export UMASK=0022

Tentukan kail untuk mengubah umasknilai begitu dir bekerja berubah.

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"

Untuk saat ini, inisialisasi hook direnv untuk zsh tidak mendukung chpwdhook. Jika permintaan tarik GH-514 belum digabung saat Anda melihat halaman ini. Silakan komentar keluar eval "$(direnv hook zsh)"dan hook direnvdi chpwdmanual dengan kode berikut,

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

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

Simba
sumber
0

Terkait, tetapi mungkin tidak berlaku dalam kasus ini, klip berikut berasal dari .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
}

Jadi untuk penggunaan interaktif, sesuatu seperti itu akan berhasil (tapi, jelas, tidak memberikan keamanan).

Ville
sumber