GNU/Linux >> Linux の 問題 >  >> Linux

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

サンプルスクリプトは次のようになります。

#!/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で開始し、上から実行します。置換インスタンスは「ルート」であるため、||

の右側は実行されません。
Linux
  1. システム管理者(root)としてコマンドを実行する方法は?

  2. Bashスクリプトがエイリアスを認識しないのはなぜですか?

  3. 〜/ .bash_profileが機能しないのはなぜですか?

  1. シェルスクリプトを常にルートとして実行する方法は?

  2. シェルからPythonスクリプトを実行する方法

  3. スクリプト ファイルの先頭に #!/bin/bash を配置する必要があるのはなぜですか?

  1. コンテナー内で docker-compose コマンドからシェル スクリプトを実行します。

  2. Kali Linux VM:root としてシェル スクリプトを実行する権限が拒否されました

  3. 別のユーザーとしてシェル スクリプトを実行する