たとえば、Ubuntu サーバーでプロセスをバックグラウンドで秘密裏に実行したいのですが、私以外の誰かがサーバーにログインするたびに、そのユーザーがプロセスを強制終了する必要があります。このようなプロセスを作成することは可能ですか? (アカウントを持っておりsudo
、変更できます/etc/bash.bashrc
)
ありがとう!
答え1
以下の内容は、さまざまな方法でシステムのセキュリティを侵害する可能性があることに注意してください。
あなたのプロセス (プロセス P と呼ぶことにします) を強制終了するスクリプトを作成します。次に、すべてのユーザーに sudoers でこのスクリプトを実行する権限を与えます。最後に、sudo を使用してこのスクリプトの適切な呼び出しを追加します/etc/bashrc
。
例として、プロセスがどこから開始されたかわかっていて/usr/local/sbin/myproc
、誰かがログインしたらすぐにそれらのプロセスをすべて強制終了したいとします。そのため、それらを強制終了するには、単純な grep と kill 戦略を使用します。
そこで、まず次のものを に入力します/usr/local/sbin/killmyprocs
。
#!/bin/sh
ps auxw|grep [m]yproc|awk '{ print $2 }'|xargs kill -TERM > /dev/null 2>&1
# end of file.
実際に実行してこれを実装する場合は、おそらくもう少し洗練されたものを作りたいと思うでしょう。そのため、適切なシグナルをトラップし、一般的に安全な方法で処理を実行するスクリプトを作成するようにしてください。
/etc/sudoers
次に、次の内容を追加して、すべてのユーザーにこのスクリプトを実行する権限を与えます。
ALL ALL = (root) NOPASSWD: /usr/local/sbin/killmyprocs
3 番目で最後のステップは、次のスクリプトに sudo 呼び出しを追加することです/etc/bashrc
。
[ "`id -n -u`" != "<my_username>" ] && sudo /usr/local/sbin/killmyprocs
自分でログインするときに「秘密の」プロセスが強制終了されるのを避けるために、自分のアカウントに置き換えてください。
要約すると、1) 出力を生成しないが、終了したいプロセスを終了させるスクリプトを作成し、2) システム上のすべてのユーザーがそのスクリプトを root として実行できるように適切なエントリを に追加し、3) sudo 経由で(または)/etc/sudoers
へのスクリプトの呼び出しを追加します。/etc/bashrc
/etc/profile
注意: /etc/bashrc
(または、/etc/profile
実際のところ) get は対話型シェルに対してのみソース化されます。つまり、ユーザーが ssh yourhost 'ps auxw' を実行してプロセス テーブルからプロセスを見つけるのはかなり簡単です。シェル初期化ファイルは参照されないため、上で紹介したメカニズムではプロセスが強制終了されることはありません。´sshd_config` を使用することでこれを回避する方法はありますForceCommand
が、これは読者の課題として残しておきます。
最後に、これには明らかにセキュリティ上の問題があることを再度お伝えしたいと思います。これは、完全なアクセス権を持たないシステムにバックドアを仕掛けようとしているようにも聞こえますが、ここではそれはあまり重要ではありません (Super User でこれらのことを質問しなければならない場合は、いずれにしてもすぐに捕まるでしょう)。
答え2
「そのプロセスはそのユーザーによって強制終了される必要がある」とはどういう意味ですか?
A) ユーザーが所有していないプロセスを強制終了させたいのですか?
プロセスを強制終了するスクリプトを作成し、setuid を設定しますchmod u+s
(何をしているのかわかっていないと、これは大きなセキュリティ ホールになる可能性があります)。
または
B) プロセスがユーザーのログインを検知して自身を終了するようにしたいですか?
まあ、それはあなたがするだろうことです。