Por que pode tocar em mudar apenas todas as vezes, ou nada quando não é proprietário

6

Temos um arquivo foobar que não pertence a mim, mas está no meu grupo:

$ ll
total 4,0K
-rw-rw-r-- 1 root hbogert 4 jan 19 12:27 foobar

Eu posso tocá-lo e ele atualizará todos os horários:

 $ stat foobar
  File: 'foobar'
  Size: 4           Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 4869333     Links: 1
Access: (0664/-rw-rw-r--)  Uid: (    0/    root)   Gid: ( 1000/ hbogert)
Access: 2017-01-19 12:27:04.499412133 +0100
Modify: 2017-01-19 12:27:04.499412133 +0100
Change: 2017-01-19 12:27:04.499412133 +0100
 Birth: -


 $ touch foobar


 $ stat foobar 
  File: 'foobar'
  Size: 4           Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 4869333     Links: 1
Access: (0664/-rw-rw-r--)  Uid: (    0/    root)   Gid: ( 1000/ hbogert)
Access: 2017-01-19 12:32:04.375412133 +0100
Modify: 2017-01-19 12:32:04.375412133 +0100
Change: 2017-01-19 12:32:04.375412133 +0100
 Birth: -

No entanto, quando eu só quero alterar o horário da modificação, ele falha:

$ touch -m foobar
touch: setting times of 'foobar': Operation not permitted

Esse comportamento é esperado?

    
por hbogert 19.01.2017 / 12:35

1 resposta

6

O comportamento é esperado, se não for óbvio. Pelo menos no meu sistema, touch faz

utimensat(0, NULL, NULL, 0)

no primeiro caso ( touch file ) e

utimensat(0, NULL, [UTIME_OMIT, UTIME_NOW], 0)

no segundo ( touch -m file ). A primeira chamada é curta para "definir os horários de acesso e modificação para a hora atual"; o segundo diz "deixe o tempo de acesso sozinho e mude a hora da modificação para a hora atual".

POSIX diz

Only a process with the effective user ID equal to the user ID of the file, or with write access to the file, or with appropriate privileges may use futimens() or utimensat() with a null pointer as the times argument or with both tv_nsec fields set to the special value UTIME_NOW. Only a process with the effective user ID equal to the user ID of the file or with appropriate privileges may use futimens() or utimensat() with a non-null times argument that does not have both tv_nsec fields set to UTIME_NOW and does not have both tv_nsec fields set to UTIME_OMIT.

( times é o terceiro argumento para utimensat() ). touch file cai sob o primeiro conjunto de restrições de acesso: qualquer acesso de gravação ao arquivo permite que os horários de acesso e modificação sejam alterados para "agora". touch -m file cai sob o segundo conjunto de restrições de acesso: você precisa ser root ou o proprietário do arquivo para poder alterar os tempos de acesso e modificação para valores que não são "agora" ou ambos "inalterados" .

Existem outras maneiras de alterar o tempo de acesso e / ou modificação para "agora" em arquivos que você não possui, mas pode ler ou escrever:

  • a leitura de um arquivo atualizará apenas o tempo de acesso;
  • gravar um arquivo ( sem lê-lo) atualizará apenas o horário da modificação.
por 19.01.2017 / 12:57