Por que não usar o comando GNU find
?
find /home/cg/root -readable -executable
ou apenas liste os arquivos:
find /home/cg/root -readable -executable -type f
Estou tentando criar um script de shell no qual o comando lista todos os arquivos legíveis e executáveis permitidos para mim ou para o usuário atual, quem quer que seja e onde quer que seja o local do usuário. Portanto, mesmo que eu mude de permissões no futuro, as alterações ainda serão refletidas.
Isso é o que eu tenho até agora:
user='id -un'
group='id -gn'
IFS='
'
for file in 'ls -al /home/cg/root'; do
perm=$(echo $file | awk '{print $1}')
fileowner=$(echo $file | awk '{print $3}')
filegroup=$(echo $file | awk '{print $4}')
ownerreadbit=${perm:1:2}
ownerexecbit=${perm:3:4}
groupreadbit=${perm:4:5}
groupexecbit=${perm:6:7}
worldreadbit=${perm:7:8}
worldexecbit=${perm:9:10}
if ["$user"=="$fileowner" && "$ownerreadbit"=="r" && "$ownerexecbit"=="x"]; then
echo $file
elif ["$group"=="$filegroup" && "$groupreadbit"=="r" &&" $groupexecbit"=="x"]; then
echo $file
elif ["$worldreadbit"=="r" && "$worldexecbit"=="x"]; then
echo $file
fi
done
Por que não usar o comando GNU find
?
find /home/cg/root -readable -executable
ou apenas liste os arquivos:
find /home/cg/root -readable -executable -type f
A resposta do usuário IporSricer find /home/cg/root -readable -executable
é o caminho a percorrer. Observe também que o comando find
tem uma vantagem adicional de poder personalizar o formato de sua saída, incluindo opções para incluir muitos detalhes possíveis sobre cada arquivo. Consulte a opção -printf
na página man
. O objetivo principal desta resposta é tentar fornecer feedback útil para sua pergunta para seus futuros scripts.
Não use a saída de ls
para o script! Este é um erro comum de iniciante. ref Por que * não * analisar 'ls'?
Em vez de usar ls
, use apenas o arquivo globbing do shell, por exemplo. %código%. Essa é (uma das razões) por que o recurso existe.
Seu script não aparece em subdiretórios, mas a resposta do usuário do IporSricer é.
Você usa mal o recurso de expansão de substring do shell, portanto nenhum dos seus testes deve funcionar. O segundo parâmetro é uma subcadeia comprimento , não uma posição final, portanto /home/cg/root/*
retorna uma subseqüência de dois caracteres; você quer ${perm:1:2}
para uma substring de único caractere.
Um teste mais rápido seria definir variáveis separadas do formulário ${perm:1:1}
e testá-las em relação a "rx".
Surpreende-me que pareça dizer que owner=${perm:1:2}
funciona dentro de um comando &&
test; Eu pensei que só deveria funcionar dentro de um [
.
Como todos os três [[
, if
, elif
estão fazendo a mesma coisa, um elif
, você pode combiná-los em um único echo
usando o if
logical 'or' operator (fora dos testes ||
).
Espero que isso seja útil.
Tags permissions bash shell shell-script