シェルスクリプトを実行するときに、rootとしてログインするようユーザーに要求する


17

私が得ている問題は、コマンドを入力すると、

su - root

シェルスクリプトファイルの先頭で、ユーザーにパスワードを入力するように要求しますが、残りのシェルスクリプトは続行しませ。次に、ターミナルを介してシェルスクリプトを手動で見つけて実行する必要があります。ユーザーがrootとしてログインすることを確認してから、残りのシェルスクリプトを続行するスクリプトが必要です。

つまり、スクリプトを任意のユーザーとして実行したいのですが、スクリプトの実行が開始されたらすぐに、ユーザーはrootに変更し、それが完了するまでスクリプトの残りをrootとして続行する必要があります。これはできますか?

回答:


34

これは非常に簡単に実現できます。

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

現在のユーザーがルートでない場合は、を使用してスクリプトを再実行しsudoます。

sudoここではなくを使用していることに注意してくださいsu。これは、引数を保持できるためです。を使用する場合、スペースまたは特殊なシェル文字が含まれている場合、引数をマングルsuするコマンドを使用する必要がsu -c "$0 $@"あります。

シェルがbashである場合、外部呼び出しを回避できますwhoami

(( EUID != 0 )) && exec sudo -- "$0" "$@"

申し訳ありませんが、説明に誤りがあるため、誤解されている可能性があります。より明確な説明を次に示します。助けてくれてありがとう!
レッドソン

@ user68857あなたの質問は明確でした。この答えはまさにあなたが望むことをします。
パトリック

私はこのエラーを得続ける:須藤:setuid rootでなければなりません
Redson

私はターミナル経由で通常のユーザーとしてスクリプトを実行したいのですが、スクリプトはスクリプトの最後までユーザーをルートに切り替える必要があります
レッドソン

@Nosscireを取得している場合sudo: must be setuid root、sudoに何かが起こっています。それを修正するには:chmod u+s $(which sudo)。そして、はい、私はあなたがやろうとしていることをよく知っています。私はスクリプトでいつも同じことをしています。
パトリック

7

UIDも確認できます。

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi


0

ログインしたい場所で、次のコマンドを追加するだけです

sudo su

これは私のコードで完璧に機能しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.