Использование grep и whoami для вывода списка процессов, которые не принадлежат текущему пользователю

Команда

ps aux --sort=-%cpu | grep -v 'whoami' должна выводить процессы, которые не были запущены эффективным пользователем. Тем не менее, он распечатывает процессы моего пользователя, а также других пользователей. Пожалуйста, объясните, что не так.

4
задан 7 December 2017 в 05:29

2 ответа

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
7
ответ дан 7 December 2017 в 05:29

Как уже объяснил ответ 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$ 
    

    Почему это важно ? Поскольку, когда вы используете $() без кавычек, подстановочный знак может стать проблемой с глобализацией оболочки, если существуют файлы, которые могут содержать часть имени пользователя, тогда команда прервется:

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

    Обратите внимание, как расширилась оболочка myuser1* в myuser1.pdf и myuser1.txt, в соответствии с оболочкой оболочки. Не то, что вы ожидали, верно?

  2. Вторая причина - если вы входите под несколькими именами пользователей (что могут делать некоторые системные администраторы) или если открыто несколько терминалов, вы можете запутаться из-за whoami output:

    $ whoami
    root
    $ logname
    xieerqi
    

    Если вы намерены отфильтровать root процессы, это будет работать, но если вы вошли как root, но хотите отфильтровать процессы вашего администратора - whoami не даст вам того, что вы хотели.

  3. Переменные окружения могут быть не установлены:

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

Итак, что мы узнали из этого?

  • процитируем переменные!
  • знают, что вы на самом деле вошли в систему, и каково ваше намерение
  • будьте осторожны с передачей материала в grep
  • , чтобы по возможности использовать команды и их опции
3
ответ дан 7 December 2017 в 05:29

Другие вопросы по тегам:

Похожие вопросы: