サンプルスクリプトは次のようになります。
#!/bin/bash
sudo su
ls /root
./test.sh
を使用する場合 通常のユーザーとして、代わりにls
を実行します スーパーユーザーとして終了すると、rootに切り替わります。ログアウトすると、ls /root
が実行されます 通常のユーザーとして。
誰かがそれについてのメカニズムについて教えてもらえますか?
承認された回答:
スクリプト内のコマンドは、独立して1つずつ実行されます。スクリプト内のすべてのコマンドの親としてのスクリプト自体は別の独立したプロセスであり、suコマンドはそれをrootに変更せず、変更できません。suコマンドはroot権限で新しいプロセスを作成します。
そのsuコマンドが完了すると、同じユーザーとして実行されている親プロセスが残りのスクリプトを実行します。
あなたがしたいのはラッパースクリプトを書くことです。特権コマンドは、メインスクリプト(~/main.sh
など)に入ります。
#!/bin/sh
ls /root
ラッパースクリプトは、次のようにroot権限でメインスクリプトを呼び出します
#!/bin/sh
su -c ~/main.sh root
このプロセスを起動するには、ラッパーを実行します。ラッパーは、ユーザーをrootユーザーに切り替えた後にメインスクリプトを起動します。
このラッパー手法を使用して、スクリプトをそれ自体のラッパーに変えることができます。基本的に、ルートとして実行されているかどうかを確認します。実行されていない場合は、「su」を使用して再起動します。
$ 0は、スクリプトにそれ自体を参照させる便利な方法であり、whoamiコマンドは私たちが誰であるかを教えてくれます(私たちはルートですか?)
したがって、ラッパーが組み込まれたメインスクリプトは次のようになります
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
execの使用に注意してください。これは、「このプログラムをで置き換える」という意味で、実行を効果的に終了し、suによって起動された新しいプログラムをrootで開始し、上から実行します。置換インスタンスは「ルート」であるため、||
の右側は実行されません。