Como sair da raiz do su-ed em determinado momento

0

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?

O que eu tentei

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.

    
por user4035 29.11.2013 / 05:02

5 respostas

0

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
    
por 28.12.2013 / 15:59
2

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.

    
por 30.11.2013 / 01:34
1

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
    
por 29.11.2013 / 09:18
0

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.

    
por 29.11.2013 / 10:00
0

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.

    
por 29.11.2013 / 11:22

Tags