シェルスクリプトで「sudo su」が残りのスクリプトをrootとして実行しないのはなぜですか?

シェルスクリプトで「sudo su」が残りのスクリプトをrootとして実行しないのはなぜですか?

スクリプトの例は次のとおりです。

#!/bin/bash
sudo su
ls /root

./test.sh一般ユーザーとして使用すると、lsスーパーユーザーとして実行されるように変更および終了し、ログアウトするとls /root一般ユーザーとして実行されます。

誰でもそのメカニズムについて教えてもらえますか?

ベストアンサー1

スクリプトのコマンドは、1 つずつ独立して実行されます。スクリプト内のすべてのコマンドの親プロセスであるスクリプト自体は別の独立したプロセスです。 suコマンドはそれをrootに変更せず、変更することもできません。 suコマンドは、root権限を持つ新しいプロセスを作成します。

suコマンドが完了した後も同じユーザーとして実行されている親プロセスは、スクリプトの残りの部分を実行します。

あなたが望むのはラッパースクリプトを書くことです。特権コマンドはデフォルトスクリプトに移動します。~/main.sh

#!/bin/sh
ls /root

ラッパースクリプトは、以下のようにroot権限でデフォルトスクリプトを呼び出します。

#!/bin/sh
su -c ~/main.sh root

このプロセスを開始するには、ユーザーを root に切り替えて、基本スクリプトを起動するラッパーを実行する必要があります。

このパッケージング技術により、スクリプトを独自のラッパーに置き換えることができます。デフォルトではrootとして実行されていることを確認し、そうでない場合は「su」を使用して再起動します。

$ 0はスクリプト参照自体を作成する便利な方法で、whoamiコマンドは私たちが誰であるかを教えてくれます(私たちはルートですか?)。

したがって、ラッパーが組み込まれた基本スクリプトは次のようになります。

#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root

execの使用に注意してください。これは、「このプログラムを次に置き換える」を意味し、実行を効果的に終了し、最上位からrootとして実行されるsuによって開始された新しいプログラムを起動します。代替インスタンスは「ルート」なので、|| の右側を実行しません。

おすすめ記事