Cómo configurar umask para una carpeta específica

23

Por algunas razones obvias, necesito establecer el umaskvalor para una carpeta específica. ¿Cómo se puede hacer eso?

¡Gracias de antemano!

ACTUALIZACIÓN 1

La razón por la que necesito usar umask para una carpeta específica es la siguiente. Tengo una aplicación web y cuando crea algún archivo, el permiso predeterminado es 700. Pero necesito al menos 755 permisos para ese archivo. Creo que ahora podría explicar el problema más claramente.

Bakhtiyor
fuente
1
Las razones pueden ser obvias para usted, pero no para nosotros. Por favor comparta lo que quiere hacer.
htorque
@htorque. Se agregó la razón por la que necesito usar umask en mi problema específico.
Bakhtiyor

Respuestas:

30

podrías usar setfacl

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

¿Dónde nameestá el nombre del grupo?

Para saber a qué grupos pertenece usted o un usuario específico, consulte En unix / linux, ¿cómo saber en qué grupo se encuentra un usuario determinado a través de la línea de comandos?

yogi70
fuente
1
Quizás setfaclha cambiado. Recibo un error que indica que -mno es una opción válida.
Ryan Burnette
Ryan, setfaclno ha cambiado. Lo más probable es que no haya proporcionado el nombre de grupo adecuado (después -m).
sergk
1
bastante seguro setfacles para las listas de control de acceso y no umask. Una mejor solución, pero en realidad no es lo que se pidió, no creo.
Wyatt8740
intente: sudo setfacl -Rdm ...(Omita la R para la recursividad) debería funcionar. @ Wyatt8740 (correcto). Para estar seguro, ejecute: man setfacly escriba /-modify. Necesitas usar sudo.
JREAM
11

No puede establecer umask por directorio, es un valor de nivel de proceso. Si necesita evitar que otros lean archivos en un directorio, revoque los bits de permisos correspondientes.

Por ejemplo, si tiene un directorio /home/user/directorycon algunos archivos y directorios que pueden obtener permisos como 777 de un proceso, establezca los bits de permiso /home/user/directoryen algo así como 700. Eso hará imposible que otros usuarios (excluyendo la raíz del superusuario) desciendan en /home/user/directory.

Soy paranoico y establezco los permisos en /home/user750, por lo que solo yo puedo leer, escribir y descender en mi directorio de inicio. Esto tiene como consecuencia que /home/user/Publicotras personas no puedan acceder a carpetas como , pero puedo vivir con eso.


Por actualización de su pregunta: aún así, no puede controlar eso en el sistema de archivos (aparte de usar un tipo de sistema de archivos diferente como FAT, que se desaconseja), debe hacerlo en su aplicación web. Si su aplicación web está codificada en PHP, puede cambiar la umask sobre la marcha utilizando la umaskfunción:

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

Puede poner esto en un archivo de configuración, como el archivo que contiene la contraseña de conexión de la base de datos (pensando en aplicaciones como Wordpress).

Recuerde que es un valor de proceso, algunos servidores web le permiten configurarlo en sus archivos de configuración, de lo contrario, podría modificar los scripts de inicio para establecer la máscara de usuario deseada. Recuerde que los permisos les gustan 755y 644son bastante peligrosos para las aplicaciones web, si el código es sensible, todos pueden leerlo.

Lekensteyn
fuente
Sé que esto es antiguo, pero creo que vale la pena mencionarlo: el administrador puede vincular mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) para evitar el problema de permisos del directorio principal.
Adrian Günter
1

Para cambiar los permisos de una carpeta, use chmod. umask es para archivos.

Configure umask para lo que necesita

umask xxx

y cambia de nuevo cuando termines

umask 022
wojox
fuente
11
umask = archivos y directorios, fmask = solo archivos, dmask = solo directorios. : P
htorque
1
Hoy aprendí algo nuevo :)
wojox
1
En realidad, esas son opciones para ciertos sistemas de archivos como NTFS (no ese comando de configuración de máscara de creación de archivos umask). Perdón por agregar información confusa.
htorque
umask cambia la máscara de creación de archivos para el proceso actual (el shell actual), si tiene un shell abierto diferente o un proceso propiedad del usuario, no creo que se vea afectado. Este comando también afectará a cualquier otro archivo creado fuera del directorio hasta que lo vuelva a cambiar.
Dave
1

Otra solución podría ser simplemente establecer la identificación del grupo en los archivos creados en el directorio, lo que hace que los nuevos archivos sean propiedad de la identificación del grupo del directorio, en lugar de la identificación del grupo del usuario que creó los archivos. Así que creo que podrías hacer:

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

chmod 4755 /my/folder

Esto establece el permiso de archivo especial setgid, lo que provocaría que todos los archivos creados /my/foldersean propiedad del www-datagrupo, que luego tiene permiso rx (5) debido al directorio padre.

Bastiaan
fuente
2
Has confundido el GUID con el valor octal SUID
adampski
1

Proporcionar una solución anterior implementada con ganchos de concha y direnv. La siguiente solución puede ser más compatible en caso de setfaclque no esté disponible en su sistema. (por ejemplo, macOS)

direnves un conmutador de entorno para el shell. Sabe cómo conectarse a bash, zsh, tcsh, fish shell y élfico para cargar o descargar variables de entorno según el directorio actual .

Uso .envrcde exportcostumbre umaskvalor de dir específica, y la exported env var será descargado cuando salga de ese directorio.

# example .envrc file
export UMASK=0022

Defina un gancho para cambiar el umaskvalor una vez que se cambie el directorio de trabajo.

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"

Por el momento, la inicialización directa de hook para zsh no admite chpwdhook. Si la solicitud de extracción GH-514 no se ha fusionado cuando ve esta página. Por favor comente eval "$(direnv hook zsh)"y el gancho direnven chpwdforma manual con la siguiente código,

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

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

Simba
fuente
0

Relacionado, pero quizás no aplicable en este caso, el siguiente clip es de .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
}

Entonces, para uso interactivo, algo así funcionaría (pero, obviamente, no para proporcionar seguridad).

Ville
fuente