Como remover recursivamente permissões de execução de arquivos sem tocar em pastas?


40

Fiz um backup para uma unidade NTFS e, bem, esse backup realmente se mostrou necessário. No entanto, a unidade NTFS atrapalhou as permissões. Eu gostaria de restaurá-los ao normal sem corrigir manualmente cada arquivo.

Um problema é que, de repente, todos os meus arquivos de texto obtiveram permissões de execução, o que está errado. Então eu tentei:

sudo chmod -R a-x folder\ with\ restored\ backup/

Mas está errado, pois remove também a xpermissão dos diretórios, o que os torna ilegíveis.

Qual é o comando correto neste caso?


11
Meta: Eu nunca entendi por que os sistemas Unix adicionam o bit de execução aos arquivos montados nos sistemas de arquivos DOS ou Windows. Não é como se alguém nunca executasse esses arquivos. Eu geralmente adiciono "noexec" às minhas opções de montagem sempre que possível.
Edward Falk

Respostas:


68
chmod -R -x+X *

O -xremove permissões de execução para todos
O +Xadicionará permissões de execução para todos, mas apenas para diretórios.


2
O comando I eventualmente usado para restaurar as permissões ao normal: `chmod -R a-x + X, u-x + rwx, go-wx + rX diretório / name`
gaazkam

3
Ver também a resposta de Edward sobre a exceção para BSD
fikr4n

4
Isso falha no requisito "sem tocar nas pastas". E se executar (talvez para o mundo) foi intencionalmente removido em alguns diretórios? Você não deve adicioná-lo.
Ben Voigt

4
isso não funcionou no Mac. Mover o sinalizador -R para o início fará com que funcione nos terminais Linux e Mac. chmod -R -x+x *
JoeMoe1984

2
Na verdade, na ordem correta, ele roda no OSX, mas na verdade não tem o efeito desejado. Você deve fazê-lo como duas etapas separadas:chmod -R -x * && chmod -R +X *
Timmmm 10/10

14

Ok, reli as páginas de manual "chmod" para Mac OS X, BSD e Linux e fiz alguns experimentos. Aqui está o que eu aprendi sobre modos simbólicos. Pode ser complicado, mas vale a pena entender:

  • A forma geral é a cláusula [, cláusula …] onde:
  • cláusula : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( quem ) (especificar vários) significa definir a permissão para usuário, grupo, outro ou todos. Se não especificado, o padrão é 'a', mas o umask está em vigor.
  • [+ - =] ( ação ) (especifique um) significa:
    • + significa adicionar as permissões especificadas às permissões já em vigor
    • - significa remover as permissões especificadas das permissões já em vigor
    • = significa definir as permissões para as permissões especificadas, limpando todas as outras
  • [rwxXstugo] ( permissão ) (especifique vários de rwxXst OU um do ugo) define as permissões para o (s) usuário (s) especificado (s) da seguinte maneira:
    • r - leia
    • w - escrever
    • x - executar / pesquisar
    • X - execute / pesquise o diretório iff OU qualquer bit de execução já foi definido.
    • s - suid ou sgid
    • t - pegajoso
    • u - copiar permissão do usuário
    • g - permissão de grupo de cópias
    • o - copiar outra permissão

Por exemplo, a+xtornaria um arquivo executável por todos. a+Xtornaria um arquivo executável por todos, se tivesse sido executável por alguém.

a+xtornaria um diretório pesquisável por todos. a+Xtambém tornaria um diretório pesquisável por todos.

A principal diferença entre o BSD e o Linux é que, com o BSD, a determinação é feita com base nas permissões do arquivo antes da execução do chmod. Enquanto no Linux, a determinação é feita imediatamente antes da cláusula + X ser executada.

Assim, com o BSD, a combinação a-x,a+Xremoveria a permissão de execução / pesquisa e tornaria um diretório pesquisável por todos, e tornaria um arquivo executável por todos, se originalmente fosse executável por alguém.

Com o Linux, a-x,a+Xremoveria a permissão de execução / pesquisa e tornaria um diretório pesquisável por todos, deixando um arquivo executável por ninguém.


Aqui está um exemplo concreto: em uma máquina BSD: um diretório, um arquivo executável e um arquivo não executável:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Observe que o diretório e "fie" são executáveis ​​/ pesquisáveis ​​pelo usuário, mas não por outros.

Agora nós executamos chmod a-x,a+X *. A primeira cláusula retira o bit de execução / pesquisa de todos os usuários para todos os arquivos, mas a segunda cláusula o adiciona novamente para "fee" e "fie". "fee" porque é um diretório e "fie" porque tinha pelo menos um bit executável para começar.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Eu tive o mesmo resultado em execução chmod -x+X.

Conclusão: A solução de Jak Gibb funcionará no Linux, mas para o BSD, você precisaria fazer duas passagens.

Não testei isso no SVr4 ou em outras variantes do Unix.


Boa leitura. Obrigado por fazer a pesquisa sobre isso.
Jak Gibb 21/07

10

Uma maneira de fazer isso:

find backup -type f -exec chmod 0644 {} +

6
Isso pode adicionar ou remover permissões que você não deseja alterar. Melhor usarchmod a-x {}
Edward Falk

11
O @EdwardFalk chmod a-x {}também pode acabar removendo as permissões que você não deseja alterar e pode deixar os arquivos graváveis ​​em todo o mundo. O ponto é que 0644 é um compromisso "geralmente razoável". O OP deve, é claro, também envolver o cérebro antes de aplicar soluções da Internet em seu computador.
Satō Katsura

4
"ax" remove a permissão de execução para usuário, grupo, outro e deixa as outras permissões inalteradas, tanto quanto eu sei. Eu entendi errado?
Edward Falk

11
@EdwardFalk Não, você está certo. Mas você não sabe o que realmente é o conjunto de arquivos e também não sabe quais são as permissões anteriores chmod. Se os arquivos de backup contiverem scripts e binários, a remoção xdeles estará incorreta. Se as permissões anteriores chmodforem 0777, chmod a-xainda as deixarão 0666, o que provavelmente não é o que você deseja. O que estou dizendo é que chmod 0644há melhores heurísticas, não que isso chmod a-xesteja errado.
Satō Katsura

11
@NajibIdrissi Exceto quando, você sabe, eles mudaram para 0777 quando você os copiou em um sistema de arquivos externo que não possui permissões UNIX. Qual é exatamente o que o OP fez.
Satō Katsura

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Removeria a permissão de execução para arquivos que não são do tipo diretório (conforme solicitado) nem link simbólico (links simbólicos geralmente são sempre rwxrwxrwx e chmodafetariam o destino do link simbólico neles).

Observe que:

 find backup -type f -exec chmod a-x {} +

apenas alteraria a permissão de arquivos regulares . Isso excluiria diretórios e links simbólicos , mas também dispositivos , chamados pipes , soquetes e possivelmente outros, dependendo do sistema (embora no caso do OP de um backup de um sistema de arquivos NTFS, é improvável que eles estejam presentes).


2

No zsh, use o qualificador glob . para corresponder apenas aos arquivos regulares (sem incluir links simbólicos) e Daos arquivos de ponto:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Se a linha de comando for muito longa, você pode usar zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.