この質問は、他のフォーラムで別の方法で尋ねられました。しかし、なぜbashで以下を実行できないのか、きちんとした説明はありません。
#!/bin/bash
command1
SWITCH_USER_TO rag
command2
command3
通常、推奨される方法は
#!/bin/bash
command1
Sudo -u rag command2
Sudo -u rag command3
しかし、bash
で、bashスクリプトの実行中のある時点で別のユーザーに変更して、残りのコマンドを別のユーザーとして実行できないのはなぜですか?
情報はすでに 他の答え にありますが、少し埋まっています。それで、ここに追加します。
bash
にはユーザーを変更する機能はありませんが、zsh
にはあります。
zsh
では、これらの変数に値を割り当てることでユーザーを変更します。
$EUID
:実効ユーザーIDを変更します(それ以外は何も変更しません)。通常、実際のユーザーIDと保存されたセットのユーザーID(setuid実行可能ファイルから呼び出された場合)の間でeuidを変更したり、euidが0の場合は何かに変更したりできます。$UID
:実効ユーザーID、実ユーザーID、および保存されたセットユーザーIDを新しい値に変更します。その新しい値が0でない限り、戻ってくることはありません。3つすべてが同じ値に設定されると、それを他の値に変更する方法はありません。$EGID
および$GID
:同じことですが、グループIDが対象です。$USERNAME
。これは、Sudo
またはsu
を使用するのに似ています。 euid、ruid、ssuidをそのユーザーのuidに設定します。また、ユーザーデータベースで定義されているグループメンバーシップに基づいて、egid、rgid、ssgid、および補足グループを設定します。 $UID
の場合と同様に、$USERNAME
をroot
に設定しない限り、戻ってくることはありませんが、$UID
の場合と同様に、ユーザーを変更できるのはサブシェルのみです。これらのスクリプトを「ルート」として実行する場合:
#! /bin/zsh -
UID=0 # make sure all our uids are 0
id -u # run a command as root
EUID=1000
id -u # run a command as uid 1000 (but the real user id is still 0
# so that command would be able to change its euid to that.
# As for the gids, we only have those we had initially, so
# if started as "Sudo the-script", only the groups root is a
# member of.
EUID=0 # we're allowed to do that because our ruid is 0. We need to do
# that because as a non-priviledged user, we can't set our euid
# to anything else.
EUID=1001 # now we can change our euid since we're superuser again.
id -u # same as above
ここで、Sudo
またはsu
のようにユーザーを変更するには、サブシェルを使用することによってのみ実行できます。それ以外の場合は、1回しか実行できません。
#! /bin/zsh -
id -u # run as root
(
USERNAME=rag
# that's a subshell running as "rag"
id # see all relevant group memberships are applied
)
# now back to the parent Shell process running as root
(
USERNAME=stephane
# another subshell this time running as "stephane"
id
)
カーネルはman 2 setuid
と友達。
今、それは呼び出しプロセスで動作します。さらに重要なことは、あなたが特権を昇格することができないことです。そのため、su
とSudo
にはSETUIDビットが設定されているため、常に最高の権限(root
)で実行され、それに応じて目的のユーザーにドロップされます。
その組み合わせは、他のプログラムを実行してシェルUIDを変更することはできません(そのため、Sudo
または他のプログラムがそれを行うことを期待できません)。また、(シェルとして)rootとして実行するか、意味のない切り替え先の同じユーザーでない限り、自分で実行してください。さらに、特権を削除すると、元に戻すことはできません。