なぜ sudo は bash スクリプトで 2 回目にパスワードを要求するのでしょうか?

なぜ sudo は bash スクリプトで 2 回目にパスワードを要求するのでしょうか?

私は非常に小さなシンプルな Web アプリを持っており、次のような非常に単純なデプロイメント スクリプトを使用して作業を少し楽にしたいと考えていました。

  1. Gitから更新をプルする
  2. コンポーザーを実行する
  3. すべてのファイルの所有者を変更する

スクリプトは基本的に正常に動作し、次のようになります。

#!/bin/bash
echo "Updating repository ...";
sudo git pull;

echo "Installing composer dependencies from lockfile ...";
composer install;

echo "Changing owner to www-data:www-data ...";
sudo chown -R www-data:www-data .;

echo "Deployment DONE!";

ただし、ご覧のとおり、このスクリプトでは sudo として実行されるコマンドが 2 つあります。つまり、 とgit pullですchown

私の問題は次のとおりです。sudoでコマンドを実行するときにシステムがパスワードを要求する頻度にはタイムアウトがあることは知っています。問題は、タイムアウト内に十分入っているにもかかわらず、スクリプトがいつもパスワードを要求します2番sudo (chown) コマンド。

なぜそうなるのか、誰か教えていただけませんか?

答え1

理由はよく分かりませんが、解決策はあります:

if [[ $(id -u $(whoami)) != 0 ]]
then
    sudo bash $( cd $(dirname $0) ; pwd -P )
    # taken from http://stackoverflow.com/a/4774063/2797066
else
    #rest of script
fi

答え2

次のようにスクリプトを実行してみませんかsudo:

sudo bash /path/to/script.sh

script.sh次のコンテンツはなしですsudo:

#!/bin/bash
echo "Updating repository ...";
git pull;

echo "Installing composer dependencies from lockfile ...";
composer install;

echo "Changing owner to www-data:www-data ...";
chown -R www-data:www-data .;

echo "Deployment DONE!"

この方法では、スクリプトはパスワードを 1 回だけ要求します。

関連情報