シェルスクリプトでsudo -iを使用する方法

シェルスクリプトでsudo -iを使用する方法

sudo -iシェルスクリプトで使用できますか?exitそのコマンドを使用すると問題が発生するようです...

#!/bin/bash

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
exit

答え1

すでにテスト済み! ...curlコマンドがどのように修正されるかを確認してください...

#!/bin/bash

sudo -u root curl -L "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo -u root chmod +x /usr/local/bin/docker-compose
exit

答え2

この方法では使用できませんsudo。スクリプトは対話型ルートシェルを提供し、シェルを終了するまで一時停止します。次に、権限なしでスクリプトの残りのコマンドを実行しますroot

あなたのスクリプトならただ特権が必要な操作を実行rootしたら、次を使用してスクリプト全体を実行しますsudo

$ sudo ./myscript.sh

スクリプトは次のとおりです。

#!/bin/bash
curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

(注:実際には、このコマンドが実際にどのような用途に使用されているのか見ていません。)

そうでなければ、これは個人的な意見であり、少なくともroot一般的な作業であれば、スクリプトのさまざまな部分を分離して独自のスクリプトに入れるのが良い考えかもしれません。

#!/bin/bash

# script that does things as an ordinary user
# ...

sudo "$HOME/admin_tasks/do_docker_stuff.sudo"

# rest of script
# ...

あるいは、他の人が行うように、スクリプトの各行の前に追加することもできますsudo。この場合、最初の行にroot権限が必要なリダイレクトがあるため、失敗するため、「修正」を使用して渡しますsudo bash -c " ... > ... "。素晴らしく読みやすいスクリプトをめちゃくちゃにしました(やはり個人的な意見です)。

しばらく考えた後:これは非常に長いスクリプトではないため、sudoスクリプト内で複数の呼び出しを実行するのはおそらく悪い考えではありませんが、呼び出しをcurl外部に残すことができますsudo

#!/bin/bash

curl -L -o ./docker-compose "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)"

chmod a+x ./docker-compose

sudo mv ./docker-compose /usr/local/bin/docker-compose
sudo chown root:root /usr/local/bin/docker-compose

最後の3つのコマンドできるdo_local-bin_install.sudoスクリプトを挿入します(他のスクリプトで再利用できるように):

#!/bin/bash

binary="$1"

chmod a+x "$binary"
chown root:root "$binary"
mv -i "$binary" /usr/local/bin/

スクリプトから呼び出すことができます。

#!/bin/bash
curl -L -o ./docker-compose "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)"

sudo ./do_local-bin_install.sudo ./docker-compose

申し訳ありません。これは意識の流れ型の答えです。誰かが理解できることを願っています。

関連情報