特定のコマンドを実行するために非rootユーザーアカウントを必要とし、ユーザーをrootに変更して残りのスクリプトを実行するシェルスクリプトがあります。 SUSE11を使用しています。パスワードプロンプトを自動化することを期待して使用しました。しかし、spawn su-を使用してコマンドが実行されると、プロンプトがルートに戻り、残りのスクリプトは実行されません。
例えば。
< non-root commands>
spawn su -
<root commands>
しかし、suの後-プロンプトはユーザーをrootとして返します。スクリプトの残りの実行方法。
Sudo -Sオプションは、マシンのIPアドレスを見つける必要があるSudo -S ifconfigコマンドを実行しないため、役に立ちません。
私はすでにこれらのリンクを調べましたが、解決策が見つかりませんでした: シェルスクリプトでスクリプトディレクトリをユーザーのhomedirに変更します
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-command
はsu
の終了後に実行されるため、root権限ではなくユーザーで実行されます(su
はuidの変更ではなく、新しいシェルを開きます現在のシェル)。もちろん、ここで同じトリックを使用できます。
su -c 'sh -s' <<EOF
# list of root commands
EOF
しかし、今はSudo
と同じです。
2番目のスクリプトなしで簡単に実行できます。これをファイルの先頭に置くだけです:
if [ "$(whoami)" != "root" ]
then
Sudo su -s "$0"
exit
fi
その後、ルートとして自動的に実行されます。もちろん、これはSudo su
パスワードを提供する必要なし-しかし、それはこの答えの範囲外です。その方法については、シェルスクリプトでのSudoの使用に関する他の質問の1つを参照してください。
これを行う最も簡単な方法は、少なくとも2つのスクリプトを作成することです。
最初のものはルート特権で2番目のものを呼び出す必要があります。したがって、2番目のスクリプトで実行するすべてのコマンドはルートとして実行されます。
例えば:
runasroot.sh
Sudo su-c'./scriptname.sh'
scriptname.sh
apt-get install mysql-server-5.5
または必要なものは何でも。
ショートバージョン:ルートとして実行されるすべてのコマンドを囲むブロックを作成します。
たとえば、ルートサブディレクトリからコマンドを実行するスクリプトを作成した場合、セグメントは次のようになります。
Sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF