使用 grep 和 whoami 列出不属于当前用户的进程

使用 grep 和 whoami 列出不属于当前用户的进程

ps aux --sort=-%cpu | grep -v 'whoami'命令应该输出未由有效用户启动的进程。但是,它打印出我的用户以及其他用户的进程。请解释哪里出了问题。

答案1

grep -v 'whoami'排除与文字字符串匹配的行whoami

如果要排除与命令输出匹配的行whoami,则需要将单引号替换为反引号

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

或者使用$(...)命令替换的形式

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

grep或者,您可以通过直接否定用户选择来完全跳过:

ps -Nu `whoami` --sort=-%cpu u

答案2

作为steeldriver 的回答已经解释过了,你的命令是错误的,因为它会过滤文字字符串 whoami,您可以使用grep -v "$(whoami)";您也可以使用 grep -v "$USER" 来达到预期的效果。

另一种更好的方法是让ps处理过滤,-Nu如steeldriver所示,或者top

$ top -u '!root'  -n 1 

不过,我建议你使用实际的登录名 -文字字符串-grep -v 'myuser'原因有三:

  1. 可以创建具有*以下角色的用户:

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

    为什么这很重要?因为当你使用时$()没有引用,如果存在可能包含部分用户名的文件,通配符可能会成为 shell 通配符的问题,那么命令将会中断:

    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 +++
    

    注意 shell 如何根据 shell 通配符扩展myuser1*myuser1.pdf和。这不是你所期望的,对吧?myuser1.txt

  2. 第二个原因 - 如果您登录多个用户名(某些系统管理员可能会这样做)或打开多个终端,您可能会对whoami输出感到困惑:

    $ whoami
    root
    $ logname
    xieerqi
    

    如果您的目的是过滤掉root进程,这将起作用,但如果您已登录但root想要过滤掉管理员用户的进程 - 这whoami将不会给您您想要的东西。

  3. 可以取消设置环境变量:

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

那么我们从中学到了什么?

  • 引用变量!
  • 知道你实际登录的身份以及你的意图是什么
  • 小心传递东西给grep
  • 尽可能尝试使用命令及其选项

相关内容