I have such a bash script:


cd /home/user/projekt
git config core.sparseCheckout true
git pull origin master
rm -rf /var/www/project/{client,public}
cp -r /home/user/project-checkout/project/dist/* /var/www/project/
cd /var/www/project/
npm install

Since I must run the copy and the npm install commands with elevated rights, I run the bash script with sudo.

However - git pull does not work as sudo since it reads form the users .gitconfig and .sshconfig files. IT says "Please make sure you have correct access rights" as expected when doing a git sudo

How to solve? I was thinking in side the script de-elveate right for one commend - possible?

As a bonus, how can I tell my script to only pursue after line 3 has successfully finished?


Instead of de-elevating, you could only sudo where necessary; so in your script:

sudo cp ...
cd /var/www/project
sudo npm install

You can use

set -e

at the start of your script to cause any error to stop the script, which would have the desired effect on line 3. I'm not sure why you need the wait there though; git pull will only return once it's finished working.

  • Indeed wait seems to become unncessary with the set -e option. I though using sudo within bash script is bad practice? – meshfields Mar 5 '15 at 0:44
  • I think it is bad practice to use it in a script as shown because the user will see a request for a password and have no idea why. Better would be echo "I need root permissions so I can copy your file foo to /var/www/project where anyone in the world can see it" and suchlike. I think better still would be echo the commands needed and let the user execute them manually. I'd be wary of scripts that prompt me for my password and have to read it or uninstall it. – msw Mar 5 '15 at 7:08
  • Generally speaking yes, but in this case the user of the script is the author of the script, so trust shouldn't be an issue. It would be better to add an explanation before the sudo, or split the script into a build script and an install script; I'll update my answer accordingly later. – Stephen Kitt Mar 5 '15 at 8:32
  • Interesting... I now ended up using grunt and sshexec to remotely connect to the machine. I gave permissions to my .npm folder, and now I dont have to sudo anymore. – meshfields Mar 5 '15 at 19:55

Check out this gist , there are multiple ways to do it ... The first one worked best when I had that same issue .LINK

You can also add the set -x to see you script in action.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.