As permissões permanecem 2700 depois de 'chmod 0700'

6

Exemplo:

# show starting permissions
% stat -c '%04a' ~/testdir
0700

# change permissions to 2700
% chmod 2700 ~/testdir

# check
% stat -c '%04a' ~/testdir
2700

# so far so good...

# now, change permissions back to 0700
% chmod 0700 ~/testdir

# check
% stat -c '%04a' ~/testdir
2700

# huh???

# try a different tack
% chmod g-w ~/testdir
% stat -c '%04a' ~/testdir
0700

Bug ou recurso?

Por que chmod 0700 ~/testdir não altera as permissões de 2700 para 0700 ?

Eu observei o mesmo comportamento em vários sistemas de arquivos diferentes. Por exemplo, no último, a linha relevante da saída de mount é

/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

Além disso, o FWIW

% stat -c '%04a' ~/
0755
    
por kjo 09.11.2017 / 16:44

3 respostas

20

Supondo que você esteja usando o GNU chmod , isso está documentado na página do manual :

chmod preserves a directory's set-user-ID and set-group-ID bits unless you explicitly specify otherwise. You can set or clear the bits with symbolic modes like u+s and g-s, and you can set (but not clear) the bits with a numeric mode.

Isso é permitido em POSIX :

For each bit set in the octal number, the corresponding file permission bit shown in the following table shall be set; all other file permission bits shall be cleared. For regular files, for each bit set in the octal number corresponding to the set-user-ID-on-execution or the set-group-ID-on-execution, bits shown in the following table shall be set; if these bits are not set in the octal number, they are cleared. For other file types, it is implementation-defined whether or not requests to set or clear the set-user-ID-on-execution or set-group-ID-on-execution bits are honored.

O raciocínio para o comportamento no GNU chmod é dado na notas de lançamento para coreutils 6.0 :

chmod, install, and mkdir now preserve a directory's set-user-ID and set-group-ID bits unless you explicitly request otherwise. E.g., chmod 755 DIR and chmod u=rwx,go=rx DIR now preserve DIR's set-user-ID and set-group-ID bits instead of clearing them, and similarly for mkdir -m 755 DIR and mkdir -m u=rwx,go=rx DIR. To clear the bits, mention them explicitly in a symbolic mode, e.g., mkdir -m u=rwx,go=rx,-s DIR. To set them, mention them explicitly in either a symbolic or a numeric mode, e.g., mkdir -m 2755 DIR, mkdir -m u=rwx,go=rx,g+s DIR. This change is for convenience on systems where these bits inherit from parents. Unfortunately other operating systems are not consistent here, and portable scripts cannot assume the bits are set, cleared, or preserved, even when the bits are explicitly mentioned. For example, OpenBSD 3.9 mkdir -m 777 D preserves D's setgid bit but chmod 777 D clears it. Conversely, Solaris 10 mkdir -m 777 D, mkdir -m g-s D, and chmod 0777 D all preserve D's setgid bit, and you must use something like chmod g-s D to clear it.

Há mais sobre o assunto em # 8391 , incluindo a justificativa adicional de que o líder 0 é ambíguo (pode indicar bits limpos ou um valor octal na mente do usuário). O manual coreutils também tem uma seção dedicada, Diretórios e os Set-User-ID e Set-Group-ID Bits ; isso revela que existem extensões GNU para permitir a limpeza dos bits em questão:

chmod =700 ~/testdir
chmod 00700 ~/testdir

limpam os bits (mas não são portáteis).

    
por 09.11.2017 / 16:50
0

Tente isto:

chmod 000700 ~/testdir

    
por 10.11.2017 / 08:24
-2

show starting permissions

% stat -c '%04a' ~/testdir 0700

== > OK!

alterar permissões para 2700

% chmod 2700 ~ / testdir

== > Tenha em atenção que está a definir o ID do grupo !!!

verifique

% stat -c '% 04a' ~ / testdir 2700

== > OK!

até agora tudo bem ...

agora, altere as permissões de volta para 0700

% chmod 0700 ~ / testdir

== > Novamente, pls note que você está remover o sinalizador de exclusão restrita ou pegajosa (não id grupo).

verifique

% stat -c '% 04a' ~ / testdir 2700

huh ???

tente uma abordagem diferente

% chmod g-w ~ / testdir % stat -c '% 04a' ~ / testdir 0700

=============================================== ============ Lastthing, você pode usar este comando para obter sucesso:

chmod 000700 ~/testdir
    
por 09.11.2017 / 19:44