Script Bash para reparar diretório e propriedade de arquivo

6

Meu cliente me fez implantar algumas pastas em vários diretórios home para seus sites de clientes. Eu fiz isso com um script Bash, mas acabou usando as permissões da conta root.

Como faço um script Bash que leva cada pasta para / home / usuário (não arquivos ou pastas ocultos), obtém a propriedade de usuário e grupo dessa pasta e, em seguida, faz um chown - R {user}. {Group} / home / usuário ?

Os servidores estão executando o CentOS Linux.

    
por ServerChecker 11.05.2010 / 08:58

6 respostas

8

Eu tenho que dar crédito total a Kyle Brandt acima. Então, se você gostou desta resposta abaixo, clique no triângulo Up em sua postagem para levantar seu status, por favor.

No entanto, eu melhorei sua rotina e senti o dever de publicá-la aqui e marcá-la como a resposta final.

Tudo o que eu adicionei à rotina de Kyle foi garantir que estamos tocando apenas o diretório home, assim a linha com os asteriscos nele. Então, eu garanto que esse diretório inicial ainda existe. Depois disso, eu faço a declaração chown. E assim como Kyle disse - remova a palavra-chave "echo" e ela realmente conduzirá a tarefa. Então, eu adicionei "-R" no chown para fazê-lo funcionar recursivamente, no caso de o problema ser mais profundo em um diretório pessoal.

#!/bin/bash

while IFS=':' read -r login pass uid gid uname homedir comment; do
    if [[ "$homedir" = **/home/** ]]; then
        if [ -d "$homedir" ]; then
            echo chown -R $uid:$gid "$homedir";
        fi
    fi
done < /etc/passwd
    
por 30.05.2010 / 20:50
8

Eu acho que o jeito que você está perguntando é meio que atrasado. Você não quer pegar cada pasta e depois encontrar o usuário, em vez disso, você quer pegar o usuário e encontrar sua pasta pessoal.

#!/bin/bash
while IFS=':' read -r login pass uid gid uname homedir comment; do 
    echo chown $uid:$gid "$homedir"; 
done < /etc/passwd

Você precisará remover o eco, claro, e precisará executar isso com permissões de root. Eu também sempre recomendo um loop while em vez de um loop for sobre ls eu mesmo. Você pode salvar este loop para fazer qualquer coisa com /etc/passwd .

    
por 11.05.2010 / 14:06
5
#!/bin/bash

for f in $( ls /home/ );
  do chown -R $f:yourgroup /home/$f
done

Não há verificação de sanidade nisto e eu o escrevi sem nenhum teste, então tenha cuidado.

(BTW, o requisito de "nenhum arquivo ou pasta oculta" será atendido pelo fato de que um arquivo oculto no Unix é apenas um arquivo regular com. antes dele, e .username não será um usuário válido para o chown ).

    
por 11.05.2010 / 09:42
3

Isso pode ajudar

   #!/bin/bash
    for file in 'ls -a | grep -v '^\.''
    do
            if [[ -d $file ]]
            then
                    fowner='ls -ld $file | nawk '{print $3}''
                    fgroup='ls -ld $file | nawk '{print $4}''
                    chown -R $fowner:$fgroup $file
            fi
    done
    
por 11.05.2010 / 09:54
1

Use getent para obter o nome do usuário, o nome do grupo e o diretório inicial de cada usuário cujo ID do usuário for maior ou igual a 500 e aplicá-los via chown -R . Além disso, hoje em dia é user:group .

    
por 11.05.2010 / 09:44
1

para i em ls -l /home/ | awk '{print $3}' ; fazer chown -R $ i / home / $ i;
para i em ls -l /home/ | awk '{print $4}' ; faça chgrp -R $ i / home / $ i; pronto

    
por 11.05.2010 / 11:08