Jak ustawić umask dla określonego folderu

23

Z oczywistych powodów muszę ustawić umaskwartość dla jednego określonego folderu. Jak to zrobić?

Dzięki z góry!

AKTUALIZACJA 1

Powód, dla którego muszę używać umask dla określonego folderu, jest następujący. Mam aplikację internetową, a kiedy tworzy jakiś plik, domyślnym uprawnieniem jest 700. Potrzebuję jednak co najmniej 755 uprawnień do tego pliku. Myślę, że mógłbym teraz lepiej wyjaśnić problem.

Bakhtiyor
źródło
1
Przyczyny mogą być dla ciebie oczywiste, ale nie dla nas. Podziel się tym, co chcesz zrobić.
htorque
@htorque. Dodano powód, dla którego muszę używać umask w moim konkretnym problemie.
Bakhtiyor

Odpowiedzi:

30

możesz użyć setfacl

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

Gdzie namejest nazwa grupy

Aby dowiedzieć się, do których grup należy ty lub konkretny użytkownik, zobacz W unix / linux jak dowiedzieć się, w której grupie jest dany użytkownik za pomocą wiersza poleceń?

yogi70
źródło
1
Być może setfaclsię zmieniło. Pojawia się komunikat o błędzie stwierdzający, że -mnie jest to prawidłowa opcja.
Ryan Burnette,
Ryan, setfaclnie zmienia się. Najprawdopodobniej nie podałeś prawidłowej nazwy grupy (po -m).
sergk
1
prawie na pewno setfacldotyczy list kontroli dostępu, a nie umask. Lepsze rozwiązanie, ale nie to, o co pytano, nie sądzę.
Wyatt8740
spróbuj: sudo setfacl -Rdm ...(Pomiń R dla rekurencji) powinno działać. @ Wyatt8740 (poprawnie). Aby mieć pewność, uruchom: man setfacli wpisz /-modify. Musisz użyć sudo.
JREAM
11

Nie można ustawić umask dla katalogu, jest to wartość na poziomie procesu. Jeśli chcesz uniemożliwić innym czytanie plików w katalogu, odwołaj odpowiednie bity uprawnień.

Na przykład, jeśli masz katalog /home/user/directoryz niektórymi plikami i katalogami, które mogą uzyskać uprawnienia z procesu, takie jak 777, ustaw bity uprawnień /home/user/directoryna około 700. Uniemożliwi to innym użytkownikom (poza rootem superużytkownika) zejście w /home/user/directory.

Jestem paranoikiem i ustawiłem uprawnienia na /home/user750, więc tylko ja mogę czytać, pisać i schodzić w moim katalogu domowym. W konsekwencji /home/user/Publicinni nie mogą uzyskać dostępu do takich folderów , ale mogę z tym żyć.


Po aktualizacji pytania: nadal nie możesz kontrolować tego w systemie plików (innym niż używanie innego typu systemu plików, takiego jak FAT, który jest zdecydowanie odradzany), musisz to zrobić w swojej aplikacji internetowej. Jeśli twoja aplikacja jest zakodowana w PHP, możesz zmienić umask w locie za pomocą umaskfunkcji:

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

Możesz umieścić to w pliku konfiguracyjnym, takim jak plik zawierający hasło połączenia z bazą danych (myślenie w aplikacjach takich jak Wordpress).

Pamiętaj, że jest to wartość procesowa, niektóre serwery pozwalają na ustawienie jej w swoich plikach konfiguracyjnych, w przeciwnym razie możesz zmodyfikować skrypty startowe, aby ustawić żądany umask. Pamiętaj, że uprawnienia takie jak 755i 644są dość niebezpieczne dla aplikacji internetowych, jeśli kod jest wrażliwy, każdy może go odczytać.

Lekensteyn
źródło
Wiem, że to jest starożytne, ale uważam, że warto wspomnieć: administrator może powiązać mount /home/user/Public( mount -o bind /home/user/Public /some/other/place), aby obejść problem z uprawnieniami do katalogu nadrzędnego.
Adrian Günter
1

Aby zmienić uprawnienia do folderu, użyj chmod. umask jest dla plików.

Ustaw umask na to, czego potrzebujesz

umask xxx

i wróć, kiedy skończysz

umask 022
wojox
źródło
11
umask = pliki i katalogi, fmask = tylko pliki, dmask = tylko katalogi. : P
htorque
1
Nauczyłem się dziś czegoś nowego :)
wojox
1
W rzeczywistości są to opcje dla niektórych systemów plików, takich jak NTFS (nie ta komenda ustawiania maski tworzenia plików umask). Przepraszamy za dodanie mylących informacji.
htorque
umask zmienia maskę tworzenia pliku dla bieżącego procesu (bieżącej powłoki), jeśli masz otwartą inną powłokę lub proces należący do użytkownika, nie sądzę, aby miało to wpływ na ten proces. To polecenie wpłynie również na wszystkie inne pliki utworzone poza katalogiem, dopóki go nie zmienisz.
Dave
1

Innym rozwiązaniem może być po prostu ustawienie identyfikatora grupy na plikach utworzonych w katalogu, co powoduje, że nowe pliki są własnością identyfikatora grupy katalogów, zamiast identyfikatora grupy użytkownika, który utworzył pliki. Myślę więc, że możesz po prostu zrobić:

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

chmod 4755 /my/folder

Ustawia to uprawnienia specjalne do plików setgid, co spowodowałoby, że wszystkie utworzone pliki /my/folderbyłyby własnością www-datagrupy, która następnie ma uprawnienia rx (5) z powodu katalogu nadrzędnego.

Bastiaan
źródło
2
Pomyliłeś
1

Zapewnij inne rozwiązanie zaimplementowane za pomocą haczyków i direnv. Poniższe rozwiązanie może być bardziej kompatybilne, jeśli setfaclnie jest dostępne w twoim systemie. (np. macOS)

direnvjest przełącznikiem środowiska dla powłoki. Wie, jak podłączyć się do bash, zsh, tcsh, fish shell i elvish, aby ładować lub zwalniać zmienne środowiskowe w zależności od bieżącego katalogu .

Służy .envrcdo exportniestandardowej umaskwartości dla określonego katalogu, a exported env var zostanie zwolniony, gdy opuścisz ten katalog.

# example .envrc file
export UMASK=0022

Zdefiniuj hak, aby zmienić umaskwartość po zmianie katalogu roboczego.

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"

Na razie inicjalizacja haka direnv dla zsh nie obsługuje chpwdhaka. Jeśli żądanie ściągnięcia GH-514 nie zostało scalone, gdy zobaczysz tę stronę. Proszę wypowiedzieć się eval "$(direnv hook zsh)"i zaczepić direnvna chpwdręcznie za pomocą następującego kodu,

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

Źródło: dynamic-umask-based-on-cwd.md

Simba
źródło
0

Powiązany, ale może nie mieć zastosowania w tym przypadku, następujący klip pochodzi z .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
}

Tak więc do użytku interaktywnego coś takiego działałoby (ale oczywiście nie zapewniało bezpieczeństwa).

Ville
źródło