Sudoユーザーがシステムにログインしていないときに、root権限で特定のプログラム(Ubuntu OS)を実行するにはどうすればよいですか?プログラムが正しく機能するには、root権限が必要です。通常のユーザーは、このプロセスをシャットダウンできないはずです。たとえば、管理者とクライアントの2人のユーザーがいます。プログラムは、クライアントがシステムにログインしたときにのみ起動する必要があります。 root権限が必要であり、クライアントはこのプロセスをシャットダウンできないはずです。
これを行うにはいくつかの方法があります。 UbuntuのグラフィカルログインはGDM(またはKubuntuを使用している場合はKDM)によって提供されます。 GDMは、Upstartサブシステムによって開始されます。
起動プロセスは次の手順に従います:
スクリプトを実行する場所
XSessionより前のすべてがrootとして実行されます。/ etc/gdm/Xsessionそしてその後のすべてはユーザーとして実行されます。これにより、スクリプトを実行するためのここでの3つの実際のオプションが残ります。
GDM/KDMのPostLoginまたはPreSessionスクリプトを変更してプログラムを実行します。ユーザー名は、[〜#〜] user [〜#〜]または[〜#〜] username [〜#〜]環境変数で使用できます。
PAMを使用してスクリプトを実行します。 PAMは、承認ユーザーを PAM_USER 環境変数。これを/etc/pam.d/gdmに追加して、スクリプトを開始します。
auth required pam_exec.so /path/to/your/script
アップスタートスクリプトを書く プログラムを実行します。スクリプトはユーザーのログイン時に開始されるため、GDMのPreSessionスクリプトによって発行されるdesktop-session-startシグナルを探します。
したがって、Upstartスクリプトは、そのシグナルを実行トリガーとして検出します。
# start when GDM's PreSession script runs
start on desktop-session-start
PreSessionからのシグナルはユーザー名を渡さないため、シグナルを微調整する必要があります。/ etc/gdm/PreSession/Defaultで、initctl行を見つけて、これに変更します。[〜#〜] user [〜#〜]の代わりに[〜#〜] username [〜#〜]を使用することもできます。
# add USER variable so Upstart script can find it
initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
詳細については、 pstart およびその startingevent のマンページを参照してください。
管理者ユーザーを回避する方法
スクリプトは、これらのメソッドの1つから取得した環境変数のユーザー/ユーザー名を調べ、それを使用して中止するか続行するかを決定する必要があります。標準のシェルスクリプト方式が機能します。上記のリストから選択した開始場所によっては、ユーザー名が[〜#〜] user [〜#〜]、[〜#〜] username [〜#〜 ]、または PAM_USER 環境変数。
setuid を使用して、常にプログラムをrootとして実行できます。セキュリティの観点から、これはおそらく非常に、非常に悪い考えです。ユーザーの1人がsetuidプログラムを悪用した場合、サーバー全体へのルートアクセスが許可されます