
Algum entorpecido correu chown -R username
. na pasta /home do nosso servidor pensando que ele estava na pasta desejada. Escusado será dizer que o servidor está apresentando muitos problemas.
Temos mais de 200 sites e não quero mostrar todos eles individualmente, então estou tentando fazer um script que mude o proprietário de todas as pastas para o nome da pasta, sem o / final.
Isso é tudo que tenho até agora, assim que puder remover o / tudo ficará bem, mas também gostaria de verificar se o arquivo contém um arquivo . nele e, se não funcionar, execute o comando, caso contrário, vá para o próximo.
#!/bin/bash
for f in *
do
test=$f;
#manipluate the test variable
chown -R $test $f
done
Qualquer ajuda seria ótimo!
Desde já, obrigado!
Responder1
Assumindo quetodospastas no diretório /home/ representam nomes de usuários, você pode usar:
for dir in /home/*/; do
# strip trailing slash
homedir="${dir%/}"
# strip all chars up to and including the last slash
username="${homedir##*/}"
case $username in
*.*) continue ;; # skip name with a dot in it
esac
chown -R "$username" "$dir"
done
Sugiro executar um loop de teste antes, verificando se o nome de usuário realmente corresponde a um diretório inicial.
Este comando AWK recupera o diretório inicial de um determinado usuário.
awk -F: -v user="$username" '{if($1 == user){print $6}}' < /etc/passwd
Comparar esse resultado com o diretório inicial existente é um exercício para o leitor.
Responder2
Você pode usar onome basecomando para fornecer o último componente de um caminho
for dir in /home/*
do
if [ -d "$dir" ]
then
username=$(basename "$dir")
chown -R "$username" "$dir"
fi
done
embora eu inicialmente o executasse como
for dir in /home/*
do
if [ -d "$dir" ]
then
username=$(basename "$dir")
echo "chown -R $username $dir"
fi
done
para ter certeza de que era sensato.