web-dev-qa-db-ja.com

シェルスクリプト内でrootユーザーに変更する

特定のコマンドを実行するために非rootユーザーアカウントを必要とし、ユーザーをrootに変更して残りのスクリプトを実行するシェルスクリプトがあります。 SUSE11を使用しています。パスワードプロンプトを自動化することを期待して使用しました。しかし、spawn su-を使用してコマンドが実行されると、プロンプトがルートに戻り、残りのスクリプトは実行されません。

例えば。

< non-root commands>
 spawn su -
<root commands>

しかし、suの後-プロンプトはユーザーをrootとして返します。スクリプトの残りの実行方法。

Sudo -Sオプションは、マシンのIPアドレスを見つける必要があるSudo -S ifconfigコマンドを実行しないため、役に立ちません。

私はすでにこれらのリンクを調べましたが、解決策が見つかりませんでした: シェルスクリプトでスクリプトディレクトリをユーザーのhomedirに変更します

シェルスクリプトでUNIXユーザーを変更する

16
Deepti Jain

Sudoはここで機能しますが、スクリプトを少し変更する必要があります。

$ cat 1.sh 
id 
Sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF

$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(Fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!

<<EOFブロックでコマンドを実行し、ブロックをSudoに渡す必要があります。

必要に応じて、もちろんsuを使用できます。ただし、パスワードを入力するexpect/pexpectを使用して実行する必要があります。

しかし、パスワードを自動的に入力する(またはオフにする)ことができたとしても、この構成は機能しません。

user-command
su 
root-command

この場合、root-commandsuの終了後に実行されるため、root権限ではなくユーザーで実行されます(suはuidの変更ではなく、新しいシェルを開きます現在のシェル)。もちろん、ここで同じトリックを使用できます。

su -c 'sh -s' <<EOF
# list of root commands
EOF

しかし、今はSudoと同じです。

20
Igor Chubin

2番目のスクリプトなしで簡単に実行できます。これをファイルの先頭に置くだけです:

if [ "$(whoami)" != "root" ]
then
    Sudo su -s "$0"
    exit
fi

その後、ルートとして自動的に実行されます。もちろん、これはSudo suパスワードを提供する必要なし-しかし、それはこの答えの範囲外です。その方法については、シェルスクリプトでのSudoの使用に関する他の質問の1つを参照してください。

9
Benubird

これを行う最も簡単な方法は、少なくとも2つのスクリプトを作成することです。

最初のものはルート特権で2番目のものを呼び出す必要があります。したがって、2番目のスクリプトで実行するすべてのコマンドはルートとして実行されます。

例えば:

runasroot.sh

Sudo su-c'./scriptname.sh'

scriptname.sh

apt-get install mysql-server-5.5

または必要なものは何でも。

1
Josh

ショートバージョン:ルートとして実行されるすべてのコマンドを囲むブロックを作成します。

たとえば、ルートサブディレクトリからコマンドを実行するスクリプトを作成した場合、セグメントは次のようになります。

Sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
0
Juan T