getent passwd |
cut -d: -f1,6 |
while IFS=: read user home; do
if [[ -d $home ]] && (( (0$(stat -c %a $home) & 2) == 2 )); then
echo $user $home
fi
done
O teste para writable mundial também pode ser escrito assim:
[[ $(stat -c %A $home) == *?w? ]]
Explicado:
-
getent passwd
- obtém informações sobre todos os usuários no sistema em um formato / etc / passwd -
cut ...
- selecione apenas o ID do usuário e o diretório inicial -
[[ -d $home ]]
- assegura que home dir é um diretório -
(( (0$(stat -c %a $home) & 2) == 2 ))
:%stat -c %a $home
retorna as permissões do arquivo no formato octal (ex:755
). Prefixe um zero para que o bash saiba que é um número octal. Em seguida, execute um bit a bit e obtenha o bit "gravável pelo mundo". Se esse valor for zero, o diretório não será gravável pelo mundo. Se o valor for 2 (binário 10), então o diretório é mundialmente gravável. - Então, se é um diretório, e é mundialmente gravável, então envie o ID do usuário e o diretório.
- o formulário alternativo
[[ $(stat -c %A $home) == *?w? ]]
examina as permissões do arquivo em forma de string (ex:drwxr-xr-x
) e verifica se o segundo caractere é um "w"