redefinir as permissões de volta ao padrão

6

Como posso redefinir a permissão para o padrão de acordo com a máscara, para que eles tenham permissões definidas quando o arquivo acabou de ser criado

Exemplo do que eu quero alcançar: umask está definido como 0022 então

touch file
mkdir directory
As permissões do arquivo

agora são rw-r--r--

As permissões do diretório

agora são rwxr-xr-x

chmod 777 file
chmod 777 directory
As permissões do arquivo

agora são rwxrwxrwx

As permissões do diretório

agora são rwxrwxrwx

existe uma maneira de redefinir o perms de volta ao padrão para que o arquivo seja rw-r--r-- e o diretório rwxr-xr-x usando chmod ?

    
por lllook 16.12.2015 / 23:32

2 respostas

3

Em zsh, você pode simplesmente subtrair umask de 0666 para arquivos e 0777 para diretórios para obter permissões padrão:

$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644

Assim, você pode aplicar chmod :

chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory

No bash, você precisa usar printf para forçar a saída em octal:

$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755

Outra forma seria criar um novo arquivo e diretório e usá-los como referência:

touch file2
mkdir directory2 
chmod --reference=directory2 directory
chmod --reference=file2 file
    
por 16.12.2015 / 23:54
5

As máscaras são aplicadas via bit a bit AND com a máscara bitwise negated , então se você quiser criar seu próprio modo de permissão final, você pode fazer:

$((mode & ~umask))

Você precisará imprimir isso de volta em octal para poder passá-lo para chmod :

$ chmod 'printf '%o' $((0777 & ~$(umask)))' directory
$ chmod 'printf '%o' $((0777 & ~0111 & ~$(umask)))' file
#^additional implicit mask of 0111 for files

em que 0777 é o modo de permissão para o qual você deseja aplicar a máscara (você pode obtê-lo com stat -c %a file ou stat -c %a directory ).

Você pode fazer um eco dos itens acima para ver a avaliação da substituição do processo (para umask de 0022 , você obterá 755 e 644 ).

Você pode criar uma função genérica a partir disso:

#takes a umask as first param and applies it to each folowing param (files)
maskMode(){
  local mask="$1" dmask mode a
  dmask="$((mask & ~0111))"; shift
  for a; do
    mode=0'stat -c "%a" "$a"'
    chmod 'printf "%0.4o\n" $(($mode & ~mask))' "$a"
  done
}

Para seu uso particular, os arquivos de referência chmod são outra opção.

    
por 17.12.2015 / 00:08

Tags