web-dev-qa-db-ja.com

sudoなしでコマンドのリストを別のユーザーとして実行できないのはなぜですか?

この質問は、他のフォーラムで別の方法で尋ねられました。しかし、なぜbashで以下を実行できないのか、きちんとした説明はありません。

#!/bin/bash
command1
SWITCH_USER_TO rag
command2
command3

通常、推奨される方法は

#!/bin/bash
command1
Sudo -u rag command2
Sudo -u rag command3

しかし、bashで、bashスクリプトの実行中のある時点で別のユーザーに変更して、残りのコマンドを別のユーザーとして実行できないのはなぜですか?

8
rag

情報はすでに 他の答え にありますが、少し埋まっています。それで、ここに追加します。

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の場合と同様に、$USERNAMErootに設定しない限り、戻ってくることはありませんが、$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
)
4

カーネルはman 2 setuid と友達。

今、それは呼び出しプロセスで動作します。さらに重要なことは、あなたが特権を昇格することができないことです。そのため、suSudoにはSETUIDビットが設定されているため、常に最高の権限(root)で実行され、それに応じて目的のユーザーにドロップされます。

その組み合わせは、他のプログラムを実行してシェルUIDを変更することはできません(そのため、Sudoまたは他のプログラムがそれを行うことを期待できません)。また、(シェルとして)rootとして実行するか、意味のない切り替え先の同じユーザーでない限り、自分で実行してください。さらに、特権を削除すると、元に戻すことはできません。

8