web-dev-qa-db-ja.com

grepとwhoamiを使用して、現在のユーザーが所有していないプロセスを一覧表示する

ps aux --sort=-%cpu | grep -v 'whoami'コマンドは、有効なユーザーによって開始されていないプロセスを出力することになっています。ただし、他のユーザーと同様にユーザーのプロセスも出力します。何が悪いのか説明してください。

4
Smile

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
steeldriver

steeldriver's answer 既に説明したように、コマンドはliteral stringwhoamiに対してフィルタリングするため、間違っています。 use grep -v "$(whoami)"; grep -v "$USER"を使用して目的の効果を実現することもできます。

別のより良い方法は、psに、steeldriverが示した-Nuまたはtopによるフィルタリングを処理させることです。

$ top -u '!root'  -n 1 

ただし、実際のログイン名を使用することをお勧めします-literal string-grep -v 'myuser'のように、3つの理由から:

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

    Shellのグロビングに従って、Shellがmyuser1*myuser1.pdfおよびmyuser1.txtに展開したことに注目してください。あなたが期待したものではありませんよね?

  2. 第二の理由-複数のユーザー名にログインしている場合(システム管理者が行う場合があります)、または複数の端末を開いている場合、whoamiの出力に混乱する可能性があります。

    $ whoami
    root
    $ logname
    xieerqi
    

    rootプロセスを除外することを目的とする場合、これは機能しますが、rootとしてログインしているが、管理ユーザーのプロセスを除外したい場合は、whoamiは提供しません。あなたが意図したもの。

  3. 環境変数は設定解除できます:

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

それで、これから何を学びましたか?

  • 変数を引用してください!
  • あなたが実際にログインしているものとあなたの意図が何であるかを知っています
  • grepにデータを渡すことに注意してください
  • 可能な場合はいつでもコマンドとそのオプションを使用するようにしてください
3