あるプロセスまたは他のプロセスは、有効なUIDを任意の他のUIDに設定できるため、有効なUIDが0(ルート)である必要があります。
シェルでは、su
コマンドはSUIDルートプログラムです。それは適切な特権(POSIX専門用語)であり、実際のUIDと実効UIDを設定することができます。同様に、sudo
コマンドは同じジョブを実行できます。 sudo
を使用すると、許可するコマンドとUIDを設定することもできます。重大な相違点は、su
では、あなたのためにターゲットユーザのパスワードが必要であることです。 sudo
には、それを実行しているユーザーのパスワードが必要です。
もちろん、ユーザーが他のユーザーのパスワードを知るべきかどうかという問題があります。一般に、ユーザーは他のユーザーのパスワードを知るべきではありません。
UIDを変更するのは難しいです。あなたは行うことができます。
su altuser -c "commands to execute as altuser"
sudo -u altuser commands to execute as altuser
をしかし、su
は制御端末からパスワードを要求されます(と制御端末がない場合に失敗します)。 sudo
を使用している場合は、資格情報をキャッシュに入れる(または設定することができます)ので、パスワードの入力は一度しか求められませんが、初めてsu
のように表示されます。
プロンプトを回避する作業は難しいです。擬似ttyを扱うツールをexpect
と並列に使うことができます。しかし、あなたはスクリプトにパスワードを格納することになっています(良い考えではありません)。または何とかそれらを見えなくしてしまいます。
私が仕事に使うツールは、asroot
と書いたものです。子プロセスが持つ必要があるUIDとGIDの属性を正確に制御することができます。しかし、それは私がそれを使用できるようにのみ設計されています - つまり、コンパイル時に、許可されたユーザー名が指定されています(もちろん変更可能です)。
これは「誰か」に現実と効果的なUIDを設定します
asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...
は、「theirgrp」にプライマリグループを設定し、すべての補助グループを削除し、「othergrp」(そのプロセスが追加されています。しかし、私のようなことを行うことができますちょうど2つのグループに属します)、umaskを0222に設定します。与えられた引数で 'somecmd'を実行します。
他のユーザーアカウントへのアクセスが制限されている(または制限されていない)特定のユーザーにとって、これはうまくいきます。一般的な解決策として、それほど熱くない。 sudo
はほとんどの点で優れていますが、まだパスワードが必要です(asroot
はありません)。
David CournapeauとMichiel Buddinghの両方には良い点がありました。スクリプトを実行するために、特権ユーザー(rootではなく)と組み合わせたos.seteuid()関数を使用します。 – Caedis