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

Команда

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

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

6 ответов

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
ответ дан 22 May 2018 в 15:35
  • 1
    Любая причина не использовать стандартную переменную $USER здесь? Зачем запускать отдельный процесс? – terdon♦ 7 December 2017 в 15:04

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
ответ дан 18 July 2018 в 01:41

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
ответ дан 24 July 2018 в 17:26

Как уже объяснил ответ steeldriver, ваша команда неверна, поскольку она фильтрует строку literal whoami, и вы можете использовать grep -v "$(whoami)"; вы также можете использовать grep -v "$USER" для достижения желаемого эффекта.

Еще один лучший способ - позволить фильтрации ps дескриптора с -Nu в качестве показанного steeldriver или top:

$ top -u '!root'  -n 1 
]

Однако я бы рекомендовал использовать фактическое имя входа - литералную строку - как в grep -v 'myuser' по трем причинам:

Можно создать пользователя с * персонаж:
 $ 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, в соответствии с чередованием оболочки. Не то, что вы ожидали, верно? Вторая причина: если вы входите в несколько имен пользователей (что могут сделать некоторые системные администраторы) или открывают несколько терминалов, вы можете запутаться в выходе whoami:
$ whoami
root
$ logname
xieerqi
Если вы хотите отфильтровать процессы root это будет работать, но если вы вошли в систему как root, но хотите отфильтровать процессы вашего администратора, whoami не даст вам ничего, что вы намеревались. Переменные окружения могут быть отменены:
$ unset USER
$ echo "empty $USER ?"
empty  ?

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

цитируйте переменные! знайте, что вы на самом деле вошли в систему, и как вы намерены быть осторожными с передачей материала в grep, попытайтесь использовать команды и их варианты, когда это возможно
3
ответ дан 22 May 2018 в 15:35

Как уже объяснил ответ steeldriver, ваша команда неверна, поскольку она фильтрует строку literal whoami, и вы можете использовать grep -v "$(whoami)"; вы также можете использовать grep -v "$USER" для достижения желаемого эффекта.

Еще один лучший способ - позволить фильтрации ps дескриптора с -Nu в качестве показанного steeldriver или top:

$ top -u '!root' -n 1 ]

Однако я бы рекомендовал использовать фактическое имя входа - литералную строку - как в grep -v 'myuser' по трем причинам:

Можно создать пользователя с * персонаж: $ 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, в соответствии с чередованием оболочки. Не то, что вы ожидали, верно? Вторая причина: если вы входите в несколько имен пользователей (что могут сделать некоторые системные администраторы) или открывают несколько терминалов, вы можете запутаться в выходе whoami: $ whoami root $ logname xieerqi Если вы хотите отфильтровать процессы root это будет работать, но если вы вошли в систему как root, но хотите отфильтровать процессы вашего администратора, whoami не даст вам ничего, что вы намеревались. Переменные окружения могут быть отменены: $ unset USER $ echo "empty $USER ?" empty ?

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

цитируйте переменные! знайте, что вы на самом деле вошли в систему, и как вы намерены быть осторожными с передачей материала в grep, попытайтесь использовать команды и их варианты, когда это возможно
3
ответ дан 18 July 2018 в 01:41

Как уже объяснил ответ steeldriver, ваша команда неверна, поскольку она фильтрует строку literal whoami, и вы можете использовать grep -v "$(whoami)"; вы также можете использовать grep -v "$USER" для достижения желаемого эффекта.

Еще один лучший способ - позволить фильтрации ps дескриптора с -Nu в качестве показанного steeldriver или top:

$ top -u '!root' -n 1 ]

Однако я бы рекомендовал использовать фактическое имя входа - литералную строку - как в grep -v 'myuser' по трем причинам:

Можно создать пользователя с * персонаж: $ 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, в соответствии с чередованием оболочки. Не то, что вы ожидали, верно? Вторая причина: если вы входите в несколько имен пользователей (что могут сделать некоторые системные администраторы) или открывают несколько терминалов, вы можете запутаться в выходе whoami: $ whoami root $ logname xieerqi Если вы хотите отфильтровать процессы root это будет работать, но если вы вошли в систему как root, но хотите отфильтровать процессы вашего администратора, whoami не даст вам ничего, что вы намеревались. Переменные окружения могут быть отменены: $ unset USER $ echo "empty $USER ?" empty ?

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

цитируйте переменные! знайте, что вы на самом деле вошли в систему, и как вы намерены быть осторожными с передачей материала в grep, попытайтесь использовать команды и их варианты, когда это возможно
3
ответ дан 24 July 2018 в 17:26

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

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