Bem, para ser específico, foi chmod -R 755
. Agora todo arquivo é executável, o que eu não quero. Eu estou pensando que eu deveria olhar para os dois primeiros bytes de cada arquivo para o #!
, mas isso vai cobrir tudo? Em vez disso, devo file
olhar para tudo e basear minha decisão nisso? Ou, mais provavelmente, existe uma maneira ainda melhor de fazer isso?
Qual é a maneira preferida de percorrer recursivamente um diretório e definir -x em arquivos que não devem ser executáveis?
permissions
files
chmod
Larry Wang
fonte
fonte
/
ou em outro diretório?/
, um diretório totalmente de minha propriedade.Respostas:
Não há bala mágica aqui. As permissões carregam informações que nem sempre são redundantes.
Se você tivesse feito isso em um diretório de sistema, seu sistema estaria em um estado muito ruim, porque você precisaria se preocupar com bits setuid e setgid e com arquivos que não deveriam ser legíveis pelo mundo e com arquivos que deveriam ser graváveis em grupo ou mundo.
Em um diretório por usuário, você precisa se preocupar com arquivos que não devem ser legíveis pelo mundo. Ninguém pode ajudá-lo lá.
Quanto à executabilidade, uma boa regra geral seria fazer com que tudo que não parece ser executado possa ser executável. O kernel pode executar scripts cujos dois primeiros bytes são
#!
, binários ELF cujos quatro primeiros bytes estão\x7fELF
onde\x7f
está o byte com o valor 12 e alguns tipos de arquivos mais raros (a.out, qualquer coisa registradabinfmt_misc
). Portanto, o comando a seguir deve restaurar suas permissões para um estado razoável (assume bash 4 ou zsh, caso contrário, usefind
para percorrer a árvore de diretórios; aviso digitado diretamente no navegador):Observe que existe uma maneira simples de fazer backup e restaurar permissões de uma árvore de diretórios, no Linux e possivelmente em outras unidades com suporte a ACL:
fonte
**/*
requerglobstar
.find
ao invés de globstar; dois, em vez de olhar para a cabeça, use ofile
comando para ver o que é e ramifique a partir daí.find
é menos confiável do queglobstar
,globstar
é preferível em quase todos os casos.Eu acredito que você vai querer algo como
find dir -type f -exec chmod ugo-x '{}' +
Ele procura todos os arquivos regulares, recursivamente no diretório (exclui diretórios e dispositivos) e remove o bit executável.
Eu começaria aqui e depois trabalharia para tornar os arquivos que deveriam ser executáveis, executáveis.
O seguinte deve funcionar exatamente como você solicitou (ele encontrará todos os arquivos regulares, cumprimente-os por #! E remova os bits x, se não forem encontrados)
possivelmente uma versão melhor do anterior (menos tubos)
fonte
grep -L '^#!'
pelo menos (as aspas são necessárias e^
restringe-se à correspondência no início da linha), mas ainda é muito permissivo, pois corresponde#!
a qualquer linha. O usoxargs
falhará com nomes de arquivos que contenham espaços ou caracteres entre aspas; usexargs -d '\n'
(requer GNUxargs
).Bem, sem uma linha shebang, o arquivo será executado como um script de shell, nominalmente com
/bin/sh
. Sua idéia é um bom começo e, supondo que o diretório em questão não contenha arquivos de missão crítica, provavelmente não há muito risco de executar algunsgrep
echmod
combo. Você pode encontrar falsos positivos, ou seja, arquivos com uma linha shebang que não devem ter o bit executável definido, mas sem saber mais informações sobre o objetivo do diretório, apenas você pode decidir se isso representa uma ameaça existencial significativa para o seu sistema e / ou dados.fonte
#!
.