私は少し前にこれをグーグルで調べていて、いくつかの方法に気づきましたが、グーグルはすべてを知っているわけではないと思います。では、どのようにしてあなたをLinuxボックスからユーザーを追い出しますか?また、そもそも彼らがログインしていることをどのように見ていきますか?と関連...あなたの方法は、ユーザーがX11 DEにログインしている場合に機能しますか?
おそらくもっと簡単な方法がありますが、私はこれを行います:
マシンにログインしているユーザーを確認します-who
またはw
を使用します。
> who
mmrozek tty1 Aug 17 10:03
mmrozek pts/3 Aug 17 10:09 (:pts/2:S.0)
TTYが接続されているシェルのプロセスIDを検索します。
> ps t
PID TTY STAT TIME COMMAND
30737 pts/3 Ss 0:00 zsh
切迫した切断を笑う(この手順はオプションですが、推奨されます)
> echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
対応するプロセスを強制終了します。
> 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)
Michealが既に指摘したように、who
を使用して、ログインしているユーザーを見つけることができます。ただし、複数のプロセスがある場合は、各プロセスを個別に強制終了するよりも便利な方法があります。killall -u username
を使用して強制終了できますそのユーザーによるすべてのプロセス。
ネクロマンシー!
私は受け入れられた答えのユーモアに感謝しますが、専門的にそれを主張することはできません。
私が知っている最も優雅な方法は、シェルに-HUPを送信してユーザーのハングアップをシミュレートすることです。これをユーザーのアイドルsshdに送信して、接続が失われることをシミュレートして、シェル環境全体(子シェルを含む)のクリーンアップをトリガーするか、これを特定のネストされたシェル(たとえば、切断されたターミナルマルチプレクサー内の設定)に送信できます本当に正確にしたい場合は、ファイルシステムをアンマウントしないでください。
write
を使用して、起動する前にターミナルのアイドル状態のptyにメッセージを送信するisでも楽しい趣味です。
ユーザー「username」をログアウトします。
skill -KILL -u username
見る man skill
その他の便利なコマンドはpkill
こちらpkill -u username && pkill -9 -u username
。 killall
には、Solaris IIRCでは完全に異なる何かを意味するという欠点があります-pkill
には、もう少し高度なオプションがあります。
まず、これはより大きな問題を示しています。システムで信頼できないユーザーがいる場合は、おそらくそれを平準化してイメージを再作成する必要があります。
これを念頭に置いて、次の一部またはすべてを実行できます。
#環境をセットアップします $ 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}
私は周りを見回しましたが、このタスクを自動化するスクリプトが1つも見つかりませんでした。
そこで、ここで提案されたソリューションに基づいて、ユーザーが何をすべきかを選択できるように、who -u
のユーザーとセッションを一覧表示する インタラクティブなBashスクリプト にすべてを混合しました。
その後、次のいずれかを実行できます。
killall -u <username> -HUP
kill <PID>
必要な情報はすべてwho -u
から取得され、mapfile
およびawk
を使用して解析されます。
後でwrite
を使用してメッセージを送信する可能性を追加します(遅延を伴うプロセスの分岐)。
kill -9
を使用して特定のセッションを強制終了するオプションも追加する予定です。しかし、私はkill
だけで問題はなく、他の人が指摘したように、kill -9
は可能な限り回避する必要があります。
Githubでコードを確認したり、自動化された方法で私がそれをどのように行っているかについてもっと知りたい場合は、
私の意見では、killall -u username
それがあなたと同じユーザーである場合、あなたは自分をキックオフするからです。したがって、kill
プロセスはより良いソリューションになります。
では、どのようにして[良性]ユーザーを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!