私はサーバー/クライアントデザインを備えたプライベートプログラムを持っています。
サーバーデーモン部分は制限されたユーザーとして実行する必要があり、プログラムはルートとして起動された場合、一部のLinuxプログラムと同様にroot権限を放棄するようには設計されていません。
だから私の質問は、起動スクリプトでこのデーモンを他のユーザーとして/etc/init.d/
使用sudo
または実行する必要がありますか?su
これはどのような違いをもたらしますか?どちらも機能しますか?他にはありませんか?
オペレーティングシステムは、「Linux From Scratch」ガイドラインを使用して構築されたカスタムGNU / Linuxオペレーティングシステムであり、両方のプログラムが正しく実行されます。
答え1
su
2つのうち、この方法は設定可能性が低く予測可能性が高いため、この目的に使用します。sudo
initスクリプトでを使用してから(誤ってまたは意図的に)initスクリプトのエントリを削除すると、initroot ALL=(ALL) ALL
スクリプト/etc/sudoers
は奇妙に中断されます。
また、構成スペースをさらに減らすために、次の形式を使用します。
su -s /bin/sh -c "my_program my_args etc" my_user
この-s
オプションは、スクリプトを中断することなく、ユーザーのデフォルトシェルを/bin/falseまたは/sbin/nologinまたは他のものに変更できることを意味します。/dev/null
プログラムがこの問題をまだ処理していない場合は、標準I / Oを別の適切な場所にリダイレクトすることもできます。
答え2
あなたの便宜のために、以下を見てください。CHPSTrunitハイパーバイザースタックのプログラム。これは非常に便利で、コマンドライン引数のエスケープなどのsudo
混乱を防ぎますsu
。
他のユーザーとしてプログラムを実行するには、次のように呼び出すことができます。
chpst -u my_user /path/to/program
それは実際にsetsid
あなたのプログラムにありますsetgid
。execve
それがすべてです(他の良い機能もたくさんあります)。
ディストリビューションに以下が含まれている場合忙しい箱、アプレットをコンパイルしていることを確認することもできますchpst
。すでにアプレットがあり、別個のパッケージが必要ない場合があります。
答え3
権限を放棄するようにプログラムを簡単に変更できる場合は、これが最善のアプローチです。起動スクリプトでユーザーIDを切り替えることは、「動作」しても面倒で柔軟性がありません。
答え4
技術的には両方ともうまく機能しますが、ここではルールに従うことをお勧めします。 sudo は通常、単一のコマンドを実行するための root として権限を高めるために使用されますが、 su は通常新しいユーザーに変更し、その新しいユーザーでコマンドを実行するために使用されます。
つまり、クイックGoogle検索を実行すると、sudoとsuに関するいくつかの考えを見つけることができます。