Usando grep e whoami para listar processos que não são de propriedade do usuário atual

4
O comando

ps aux --sort=-%cpu | grep -v 'whoami' deve gerar processos que não são iniciados pelo usuário efetivo. No entanto, ele imprime os processos do meu usuário e de outros usuários. Por favor, explique o que está errado.

    
por Smile 07.12.2017 / 02:27

2 respostas

7

grep -v 'whoami' exclui linhas correspondentes à string literal whoami

Se você quiser excluir linhas que correspondam à saída do comando whoami , será necessário substituir as aspas simples por backticks

ps aux --sort=-%cpu | grep -vFe 'whoami'

ou use a forma $(...) de substituição de comando

ps aux --sort=-%cpu | grep -vFe "$(whoami)"

Alternativamente, você pode pular o grep ao negar diretamente a seleção do usuário:

ps -Nu 'whoami' --sort=-%cpu u
    
por steeldriver 07.12.2017 / 02:36
3

Como a resposta da steeldriver já foi explicada, seu comando está errado porque filtra contra string literal whoami e você pode usar grep -v "$(whoami)" ; você também pode usar grep -v "$USER" para obter o efeito desejado.

Outra maneira melhor seria deixar ps manipular a filtragem com -Nu como o driver de aço mostrou ou top :

$ top -u '!root'  -n 1 

No entanto, recomendo que você use o nome de login real - a string literal - como em grep -v 'myuser' por três motivos:

  1. É possível criar um usuário com * character:

     $ sudo -p ">" useradd  -s /bin/bash -p "$(mkpasswd -m SHA-512 '123')" 'myuser1*'
     >
    
     $ su 'myuser1*'
     Password: 
     myuser1*@eagle:/home/xieerqi$ 
    

    Por que isso é importante? Porque quando você usa $() sem citar, o curinga pode se tornar um problema com o shell globbing se houver arquivos que possam conter parte do nome de usuário, então o comando irá quebrar:

    myuser1*@eagle:/home/xieerqi$ ps aux | strace -e execve grep -v 
    $(whoami) > /dev/null
    execve("/bin/grep", ["grep", "-v", "myuser1.pdf", "myuser1.txt"], 
    [/* 82 vars */]) = 0
    +++ exited with 1 +++
    

    Observe como o shell expandiu myuser1* em myuser1.pdf e myuser1.txt , de acordo com a globalização da concha. Não é o que você esperava, né?

  2. Segunda razão - se você estiver fazendo login em vários nomes de usuário (o que alguns administradores de sistema podem fazer) ou se tiver vários terminais abertos, você poderá ficar confuso com whoami output:

    $ whoami
    root
    $ logname
    xieerqi
    

    Se a sua intenção for filtrar root processos, isso funcionará, mas se você estiver logado como root ainda deseja filtrar os processos do usuário administrador - whoami não lhe dará o que você pretendido.

  3. Variáveis de ambiente podem ser desconfiguradas:

    $ unset USER
    $ echo "empty $USER ?"
    empty  ?
    

Então, o que aprendemos com isso?

  • cite as variáveis!
  • saiba em que você está realmente conectado e qual é sua intenção
  • tenha cuidado ao passar o material para grep
  • tente usar comandos e suas opções sempre que possível
por Sergiy Kolodyazhnyy 07.12.2017 / 03:09