web-dev-qa-db-ja.com

害のないユーザーをどのようにシステムから追い出しますか?

私は少し前にこれをグーグルで調べていて、いくつかの方法に気づきましたが、グーグルはすべてを知っているわけではないと思います。では、どのようにしてあなたをLinuxボックスからユーザーを追い出しますか?また、そもそも彼らがログインしていることをどのように見ていきますか?と関連...あなたの方法は、ユーザーがX11 DEにログインしている場合に機能しますか?

68
xenoterracide

おそらくもっと簡単な方法がありますが、私はこれを行います:

  1. マシンにログインしているユーザーを確認します-whoまたはwを使用します。

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. TTYが接続されているシェルのプロセスIDを検索します。

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. 切迫した切断を笑う(この手順はオプションですが、推奨されます)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. 対応するプロセスを強制終了します。

    > kill -9 30737
    

who-uフラグを指定することで、手順1と2を組み合わせることができることを発見しました。 PIDは右側の数字です。

> who -u
mmrozek  tty1         Aug 17 10:03 09:01        9250
mmrozek  pts/18       Aug 17 10:09 01:46       19467 (:pts/2:S.0)
147
Michael Mrozek

Michealが既に指摘したように、whoを使用して、ログインしているユーザーを見つけることができます。ただし、複数のプロセスがある場合は、各プロセスを個別に強制終了するよりも便利な方法があります。killall -u usernameを使用して強制終了できますそのユーザーによるすべてのプロセス。

33
sepp2k

ネクロマンシー!

私は受け入れられた答えのユーモアに感謝しますが、専門的にそれを主張することはできません。

私が知っている最も優雅な方法は、シェルに-HUPを送信してユーザーのハングアップをシミュレートすることです。これをユーザーのアイドルsshdに送信して、接続が失われることをシミュレートして、シェル環境全体(子シェルを含む)のクリーンアップをトリガーするか、これを特定のネストされたシェル(たとえば、切断されたターミナルマルチプレクサー内の設定)に送信できます本当に正確にしたい場合は、ファイルシステムをアンマウントしないでください。

writeを使用して、起動する前にターミナルのアイドル状態のptyにメッセージを送信するisでも楽しい趣味です。

23
Andrew B

ユーザー「username」をログアウトします。

skill -KILL -u username

見る man skill

13
bsd

その他の便利なコマンドはpkillこちらpkill -u username && pkill -9 -u usernamekillallには、Solaris IIRCでは完全に異なる何かを意味するという欠点があります-pkillには、もう少し高度なオプションがあります。

11

まず、これはより大きな問題を示しています。システムで信頼できないユーザーがいる場合は、おそらくそれを平準化してイメージを再作成する必要があります。

これを念頭に置いて、次の一部またはすべてを実行できます。

#環境をセットアップします
 $ BADUSER = foo#fooは問題のユーザー名です
 $ USERLINE = $(grep '^ $ {BADUSER}:'/etc/passwd )
 $ BADUID = $(echo $ {USERLINE} | awk -F: '{print $ 3}')
 $ BADGID = $(echo $ {USERLINE} | awk -F: '{ print $ 4} ')
 $ BADHOMEDIR = $(echo $ {USERLINE} | awk -F:' {print $ 6} ')
 $ BDIR = "〜/ backup/home-backup /" 
 $ TSTAMP = $(date +%F)
 $ TAR_FILENAME = "$ {BADUSER}-$ {TSTAMP} .tar.bz2" 
 $ OWNED_FILENAME = "$ {BADUSER } -files-$ {TSTAMP} .txt "
 
#ユーザーの今後のログインを無効にする
 $ Sudo chsh -s/bin/false" $ {BADUSER} "
 
#ユーザーのすべてのプロセスを終了します
 $ BADPROCS = $(ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
 $ Sudo kill -9 $ {BADPROCS} 
 
#ユーザーのホームディレクトリをバックアップ/クリア
 $ mkdir -p $ {BDIR} 
 $ Sudo tar -cfj $ {BDIR}/$ {TAR_FILENAME} $ {BADHOMEDIR} 
 $ Sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR}/* 
 
#すべてのファイルを検索ユーザーが所有[[__] __。] $ Sudo find/-user $ {BADUSER}>〜/ backup/$ {OWNED_FILENAME} 
 
#remove user 
 $ Sudo userdel $ {BADUSER} 
3
cjac

私は周りを見回しましたが、このタスクを自動化するスクリプトが1つも見つかりませんでした。

そこで、ここで提案されたソリューションに基づいて、ユーザーが何をすべきかを選択できるように、who -uのユーザーとセッションを一覧表示する インタラクティブなBashスクリプト にすべてを混合しました。

その後、次のいずれかを実行できます。

  • ユーザーのすべてのセッションを終了するkillall -u <username> -HUP
  • 特定のセッションを終了するkill <PID>

必要な情報はすべてwho -uから取得され、mapfileおよびawkを使用して解析されます。

後でwriteを使用してメッセージを送信する可能性を追加します(遅延を伴うプロセスの分岐)。

kill -9を使用して特定のセッションを強制終了するオプションも追加する予定です。しかし、私はkillだけで問題はなく、他の人が指摘したように、kill -9は可能な限り回避する必要があります。

Githubでコードを確認したり、自動化された方法で私がそれをどのように行っているかについてもっと知りたい場合は、

0
Gus Neves

私の意見では、killall -u usernameそれがあなたと同じユーザーである場合、あなたは自分をキックオフするからです。したがって、killプロセスはより良いソリューションになります。

0
Mailo

では、どのようにして[良性]ユーザーをLinuxボックスから追い出すのでしょうか。

最終的には、ユーザーIDから所有、関連付け、または生成されたプロセスを識別して終了することになります。その最終目標に到達するために使用するコマンドは、そこに到達する限り、必ずしも重要ではありません。

基本的に2つの答え...

オプションA:上記のユーザーからのログアウトを引き起こします。したがって、これは、ユーザーが所有し、uidが追跡可能で、実行中の特定のLinuxディストリビューションのログインプロセスの一部として分類されるプロセスを識別することを意味します。 「ログイン」の前にSSHまたはVNCなどの親プロセスがあり、「ログイン」の後にGDMなどの子プロセスがあることを認識してください。通常、親プロセスを強制終了すると、子プロセスが強制終了されますが、常にではありません。したがって、ログアウト後に明らかに不要になった他のプロセスを強制終了する必要があります。これをすべて実行すると、バックグラウンドジョブが実行され続けることになります...害のないユーザーであり、ログアウトしたいだけかもしれません。私の知る限りでは、 /usr/bin/wおよび/usr/bin/whoは、ログインプロセスを通過したユーザーを報告します。

オプションB:特定のuidが所有するすべてのプロセスを完全に終了します。これは、単に、そのユーザーが所有するすべてのプロセスを強制終了することを意味します。これにより、ログインしている場合もログアウトされます。これにより、 システムから外します。それは単純なps -ef | grep <uid>そして、許容できる方法でこれらのプロセスをすべて終了します。

sLES 11のfwiwはそれを報告します

男のスキル...これらのツールはおそらく時代遅れで移植性がありません。コマンド構文の定義が不十分です。代わりに、killall、pkill、およびpgrepコマンドの使用を検討してください。

kill -9 FTW!

0
ron