回答:
おそらくもっと簡単な方法がありますが、私はこれを行います:
マシンにログインしているユーザーを確認します- 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
私はちょうどあなたが与えることによって、ステップ1と2を組み合わせることができます発見したフラグを、PIDは右側の数字です:who
-u
> 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)
kill -9
ね?これは本当にBOFHモードです。
Michealが既に指摘したように、who
ログインしているユーザーを見つけるために使用できます。ただし、複数のプロセスがある場合は、各プロセスを個別に強制終了するよりも便利な方法killall -u username
があります。
killall
するのはグラフィカル環境でもやや適切です。これは、シェルを殺すだけではないためです。
ネクロマンシー!
受け入れられた答えのユーモアに感謝しますが、専門的にそれを支持することはできません。
私が知っている最も優雅な方法は、-HUPをシェルに送信してユーザーのハングアップをシミュレートすることです。これをユーザーのアイドルsshdに送信して、失われた接続をシミュレートし、シェル環境全体(子シェルを含む)のクリーンアップをトリガーするか、特定のネストされたシェル(たとえば、切断されたターミナルマルチプレクサー内に設定されたシェル本当に正確にしたい場合は、ファイルシステムをアンマウントしないようにしてください)。
使用してwrite
、あなたがそれらを起動する前に、末端アイドルのptyにメッセージを送信することがあるけれども楽しい趣味。
echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP
(睡眠がユーザーに保存し、ログオフする機会を与えるが、あなたはおそらく唯一とにかくログオフするのを忘れて、ユーザーにこれを使用している)
ユーザー「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 = $(日付+%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} #ユーザーを削除 $ sudo userdel $ {BADUSER}
you have users that you don't trust on your system
...または、他の人へのメッセージとしてあなたが1人を殺しているだけかもしれません。結局のところ、システム管理者の信条は「愛されるより恐れられる方が良い」のではないでしょうか?すべてのジョークは別として、マキャベリはオライリーの本を書くべきです。
私はあちこち見て、このタスクを自動化する単一のスクリプトを見つけることができませんでした。
そこで、ここで提案したソリューションに基づいて、ユーザーとセッションを一覧表示する対話型のBashスクリプトにすべてを混合しwho -u
て、ユーザーが何をすべきかを選択できるようにしました。
その後、次のいずれかを実行できます。
killall -u <username> -HUP
kill <PID>
必要な情報はすべてから取得who -u
され、mapfile
and を使用して解析されawk
ます。
write
後で(遅延を伴うプロセスの分岐)を使用してメッセージを送信する可能性を追加します。
特定のセッションを強制終了するオプションもおそらく追加しますkill -9
。しかしkill
、他の人が指摘したように、私は問題がなかったkill -9
ので、できれば避けるべきです。
githubでコードを確認したり、自動化された方法でそれをどのように行っているかについて詳しく知りたい場合は、コードを確認できます。
それでは、どのようにして[良性]ユーザーをLinuxボックスから追い出しますか?
最終的には、ユーザーIDから所有、関連付け、または生成されるプロセスを識別して終了します。その最終目標に到達するために使用するコマンドが何であれ、そこに到達する限り必ずしも問題ではありません。
基本的に2つの答え...
オプションA: そのユーザーからのログアウトを引き起こします。したがって、これは、ユーザーが所有し、uidで追跡可能で、実行中の特定のLinuxディストリビューションのログインプロセスの一部として分類されるプロセスを識別することを意味します。「ログイン」の前にSSHやVNCなどの親プロセスがあり、「ログイン」の後にGDMなどの子プロセスがあることを認識してください。したがって、ログアウト後に明らかに不要になったこれらの他のプロセスを強制終了する必要があります。これをすべて実行する場合、これはバックグラウンドジョブの実行を継続します。これは良性のユーザーであり、単にログアウトしたいためです。限り私は知っている、など/usr/bin/w
と/usr/bin/who
プロセス内のログを通過した人報告されます。
オプションB: 単にいずれかを殺す意味し、完全に特定のuidが所有するすべてのプロセス、そして所有するすべてのプロセスを終了し、彼らがログインしている場合、ユーザは、これはまた、それらをログアウトすると述べこれを満たすでしょう。オフシステムキックにそれらを。それは単純である必要があり、ps -ef | grep <uid>
それからそれらのすべてのプロセスを受け入れ可能な方法で終了します。
SLES 11で報告されるfwiw
man skill ...これらのツールはおそらく時代遅れで移植性がありません。コマンド構文の定義が不十分です。代わりに、killall、pkill、およびpgrepコマンドの使用を検討してください。
kill -9
FTW!
私の意見では、それはkillall -u username
あなたと同じユーザーである場合、あなたは自分自身をキックオフするので、使用することは本当に有用ではありません。したがってkill
、このプロセスはより優れたソリューションになります。
who(1)
かw(1)
。インストールされている可能性のあるルートキットを取り除く唯一の絶対確実な方法は、システムを完全に消去して再インストールすることです。