24

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

例えば。

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

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

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

私はすでにこれらのリンクを通り抜けましたが、解決策を見つけることができませんでした: シェルスクリプトでスクリプトディレクトリをユーザーのホームディレクトリに変更します

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

4

5 に答える 5

26

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

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

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

于 2012-07-24T18:20:01.027 に答える
10

2 番目のスクリプトを使用せずに簡単に実行する方法があります。これをファイルの先頭に置くだけです:

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

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

于 2015-08-07T08:14:06.257 に答える
2

また、以下のようなシェル スクリプト内で「root」ユーザーに変更する場合、データ抽出用の awk や単純なシェル変数の定義などのいくつかの Linux ユーティリティが奇妙な動作をすることに注意してください。

これを解決するには、EOF の代わりに <<'EOF' を使用してドキュメント全体を引用します。

sudo -i <<'EOF'
ls
echo "I am root now"
EOF
于 2019-12-25T05:58:52.090 に答える
2

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

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

例えば:

runasroot.sh

sudo su-c'./scriptname.sh'

スクリプト名.sh

apt-get install mysql-server-5.5

またはあなたが必要とするものは何でも。

于 2013-03-16T13:13:17.380 に答える