Script de bash para remover o usuário

0

Eu preciso criar um script Bash para remover um usuário.
Nós usamos o RHEL versão 4, 5, & 6.
Vamos dizer que os nomes de usuários são Ray4 & Ray6 & o nome do script é bom.
Tarefas específicas para este script são:

  1. O usuário existe?
  2. Se o usuário existir, backup / homedirectory para este usuário, remova o nome de usuário e coloque em / root / DeletedUsers
  3. Se o diretório / root / DeletedUsers não existir, crie-o.
  4. Se houver alguma regra de firewall para esse usuário, envie-me os resultados dessas regras e em quais nós.
  5. Se esse usuário existir em sudoers, não exclua, mas comente.

Isso é o que eu tenho até agora. Eu quero ter certeza de que isso funcione, antes de executá-lo no RHN Satellite. Depois de fazer as alterações sugeridas. Aqui estão os novos erros que estou recebendo agora.

[root@localhost bin]# ./deal
./deal: line 7: [[!: command not found
Usage: userdel [options] LOGIN

Options:
  -f, --force                   force removal of files,
                                even if not owned by user
  -h, --help                    display this help message and exit
  -r, --remove                  remove home directory and mail spool
  -Z, --selinux-user            remove SELinux user from SELinux user mapping

Usage: userdel [options] LOGIN

Options:
  -f, --force                   force removal of files,
                                even if not owned by user
  -h, --help                    display this help message and exit
  -r, --remove                  remove home directory and mail spool
  -Z, --selinux-user            remove SELinux user from SELinux user mapping

Null message body; hope that's ok
./deal: line 22: [: -me: binary operator expected



This is source code:
[root@localhost bin]# cat -n deal

 1  #!/bin/bash
 2  
 3  count=$(egrep -c Ray[46] /etc/passwd)
 4  firewall=$(grep -c "192.168.5.5" /etc/sysconfig/iptables)
 5  doers=$(egrep -c Ray[46] /etc/sudoers)
 6  
 7  if [[! -d /root/DeletedUsers]]
 8  then mkdir /root/DeletedUsers
 9  
10  fi
11  
12  cp -Rf /home/Ray[46] /root/DeletedUsers
13  userdel -rf Ray [4]
14  userdel -rf Ray [6]
15  
16  if [ $firewall -ne 0 ]
17  
18  then mail -s "$firewallrulesexist" emailaddress < /dev/null
19  
20  fi
21  
22  if [ $doers -me 0 ]
23  then sed ^Ray[46] /#/i
24  
25  EOF
26  fi
    
por Jake 25.04.2014 / 16:44

2 respostas

1

Sugiro que você use getent para verificar a existência de um usuário. Este script deve fazer você ir.

##Check if the user exists using getent command
user_exists=$(getent passwd $1)

##If the user doesn't exist, we need not perform the backup. 

if [ -z "$user_exists" ] 
then
        echo "User $1 does not exist"
else
        cd /root
        #Incorporating derobert's suggestion here. 
        mkdir -p "DeletedUsers"
        ##Use tar or rsync to do the backup as cp will be inefficient.
        tar czvf "$1".tar.gz /home/"$1"
        firewall=$(grep -c "192.168.5.5" /etc/sysconfig/iptables)
        doers=$(egrep -c "$1" /etc/sudoers)
        userdel -rf "$1"
        if [ $firewall -ne 0 ]
        then 
            mail -s "$firewallrulesexist" emailaddress < /dev/null
        fi
        if [ $doers -ne 0 ]
        then 
            sed ^"$1" /#/i
        fi
fi

Você pode chamar o script como ./deal ray[4] e, se precisar executar outro usuário, poderá chamá-lo usando ./deal ray[6] . Eu não testei o script no meu sistema, mas isso deve ajudá-lo, como no caso, se você precisar excluir qualquer outro usuário no futuro, você não precisa modificar o script, mas sim chamar o script com o nome de usuário como um argumento.

EDITAR

Como sugere o derobert, você pode omitir o teste de diretório se usar o -p flag.

    
por 25.04.2014 / 18:29
1

Se Ray[46] for seguramente único, praticamente todos os testes no seu script são redundantes.

printf %s\n 123 456 | sed '/2/s///'

#OUTPUT#
13
456

O texto acima varrerá sua entrada para qualquer linha que contenha /addressed/ string 2 e, se encontrada, alterará apenas essa linha para conter tudo, menos a string endereçada. Os itens a seguir simplesmente excluem apenas as linhas endereçadas :

printf %s\n 123 456 | sed '/2/d'

#OUTPUT#
456

Portanto, grep then sed não é necessário. Verdadeiro, grep é mais rápido que sed , mas no tempo que leva para invocar grep e [test] sua saída então invocar sed , sed provavelmente já teria terminado de limpar todos os arquivos em questão da cadeia incorreta.

Então, novamente, se você quiser grep then sed por qualquer motivo, o seguinte seria muito mais direto ao ponto:

remove=string ; for f in $(grep -l "$remove" $file_list) ; do 
    printf %s "$(sed "/$remove/s///" "$f")" >"$f" ; done

Ou com o GNU sed :

sed -i "/$remove/s///" $(grep -l "$remove" $file_list)

E, como mencionado acima, mkdir -p cria um diretório de destino apenas se necessário, portanto, isso deve ser suficiente:

mkdir -p /root/DeletedUsers ; mv /home/$string "$_"

Você pode até obter um registro de tudo para analisar exatamente o que foi feito apenas nessas máquinas. Ocorreu algo:

#ensure $tgt dir exists
mkdir -p ${tgt=/root/DeletedUsers}
#handles Ray4 and Ray6 cases on a single machine
for remove in /home/Ray[46] ; do hostname #print hostname
#nothing happens unless user's $HOME exists
    cd "$remove" 2>/dev/null || { 
        echo "No $remove found here."
        break
    }
#get out of user's $HOME and mv it
    cd - ; mv -v "$remove" "$tgt"
#strip $remove to only username then userdel it
    remove=${remove##*/} 
    userdel -rf $remove
#if $remove in /etc/sudoers comment file's line and and copy change to stderr
    sed -nei "/$remove/{!p;b};s/^/#/p" /etc/sudoers \
        -ne "s/^/sudoers change: /w /dev/stderr" 
#print all iptables lines containing string $remove
    grep "$remove" /etc/sys/config/iptables |
#for each rule found append a noticeable marker line
        sed "a--- "$(hostname)"firewall found"
#finish for statement and pipe all to remote cat to append to log    
done 2>&1 | ssh you@host 'cat >>~/Raydel.log'

Isso pressupõe que o usuário de destino tenha um $HOME em /home com o nome de usuário do usuário. Se a suposição estiver correta, ela só executará ações em qualquer máquina na qual o nome de usuário do usuário-alvo esteja registrado.

Para fazer o mesmo sem grep , você também pode deixar tee . Basta alterar a linha sed para:

for f in $file_list ; do 
    sed -ni "/$remove/{h;s///};p;\$!b;x;/$remove/s|.*|$f|w /dev/stderr" "$f"
done

Isso substituirá sed's holdpace por cada nova linha sed localizada contendo a string "$remove" . Quando sed's passar pela varredura e chegar na última linha, ele alternará para o espaço de suspensão e, se encontrar alguma referência a $remove , gravará o nome do arquivo em stderr .

Se você executar um script como o que escrevi acima em sua própria máquina e você ssh em todos os destinos, não será necessário abrir uma conexão ssh de cada um deles de volta para o seu próprio máquina - você já está lá. Você pode remover o último |pipe e tudo que o segue e fazer isso:

script=$(cat <<\SCRIPT
#body of the script I wrote above less the |pipe and all that followed
SCRIPT
) 
for host in $hosts ; do ssh you@$host "$script" ; done >>~/Raydel.log
    
por 25.04.2014 / 20:13