Para matar todos os processos do bash, pertencentes ao root, usei o seguinte script:
for pid in $(pgrep -u 0 bash); do
if [ "$pid" != "$$" ]; then
kill -HUP "$pid";
fi
done
Suponha que o usuário use su
, alternando para root
$ su
Password:
bash-4.2# crontab -l
Como posso sair de todos os usuários de root
em um determinado momento?
Eu sei, que usando este comando:
bash-4.2# ps -A -u root | grep bash
2303 tty1 00:00:00 bash
2548 pts/0 00:00:00 bash
3040 pts/0 00:00:00 bash
3080 pts/2 00:00:00 bash
podemos obter todos os shells Bash, de propriedade de root
. Mas como posso selecionar o que foi gerado por su
? Quando eu corri o echo $$
no shell, ele dá isto:
bash-4.2# echo $$
3040
Então eu tentei:
bash-4.2# kill 3040
Mas isso não eliminou o shell root
. Além disso, se eu criar um cron job echo $$
, ele não fornecerá o PID necessário. Então, isso não vai funcionar.
Agora estou preso.
pkill -u 0 su
alls all su
processos sendo executados como root (o que, por sua vez, mata seus shells filhos).
Se você quiser apenas matar os processos bash executados em su
:
for pid in $(pgrep -u 0 bash); do
parent_pid=$(ps -o ppid= -p "$pid")
parent_command=$(ps -o comm= -p "$parent")
if [ "$parent_command" = "su" ]; then kill -HUP "$parent_pid"; fi
done
Dito isto, esta é provavelmente uma má ideia. E se a casca que você está matando estiver fazendo algo importante?
Se você quiser matar shells que permanecem desassistidos por muito tempo, defina o TMOUT
variável em .bashrc
. Por exemplo, com TMOUT=600
, o bash sai automaticamente se não receber entrada por 10 minutos.
Pense cuidadosamente sobre o que você está tentando alcançar. Há uma boa chance de matar munições não resolverem o problema que você está tentando resolver.
Como outros estados, não deve ser necessário. Você deve ver primeiro porque existem muitos su
processos ativos.
Por outro lado, para matar todos esses processos, e. no Linux você pode usar:
ps aux | awk '/su( -)?$/ {print $2}' | xargs sudo kill
Se você não se importa em matar outros su
processos ( su -u username
), a abordagem simples será
echo "killall su" | at 1145 jan 31
Se você se importa, use a solução da Emy, alimentando-a com "at" por "um certo tempo" ou adicionando-a ao crontab para chamadas periódicas.
Note que os usuários de smartass irão superar o filtro de Emy com su -u root
, e caçá-los será difícil, pois su
tem algumas opções que poderiam enganar o regexp. killall
é mais infalível, mas pode causar danos colaterais conforme descrito acima.
pkill
(e possivelmente seu companheiro pgrep
) deve funcionar bem, se é que você realmente precisa fazer isso.
Algo como pkill su
enviará um sinal de eliminação para todos os processos su
. Veja também o parâmetro --full
; veja a página man para detalhes.
Para atingir o "em um determinado momento", a solução óbvia é usar at
, que é especificamente projetado para executar um determinado comando em um determinado momento e somente então (ao contrário do cron, que executa comandos planejados repetidamente quando a hora do sistema corresponde a alguns critérios determinados).
Juntando tudo, você recebe algo como echo pkill su | at 17:30
. Note que o at
terá que ser executado como root.
Tags bash