I have a long and long-running bash script where a handful of commands need to be run as root while the majority of commands need to be run as the regular user before sudo, because it would mess up file ownership and such.
I came up with some methods, but each of them have some problems
Method 1: Using sudo inside the file
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
This would look good, from the way the code is written. sudo
is written before the few statements that actually need to be run by root, but if the time between each sudo
call is too long sudo
again asks for a password. Also, if the first execution of sudo
fails, e.g. due to an invalid password, the rest of the script is still executed.
Method 2: using sudo to call the file and then change back to the original user when needed
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
This also sucks, because I need to add su username -c
in front of almost every line. Also finding the original username after sudo
is possible, but cumbersome.
Is there a better way?
Edit: I only posted small, nonsensical scripts here to show what I am talking about. In the actual script I have some lines that need sudo (starting and stopping services), some lines where it does not matter if there is sudo and quite a lot of lines that really need to be run without sudo.
sudo
if it needs to have elevated permissions. But there's no point in switching tosu username -c
to run anecho
. In other words, this sounds like an [XY]. Could you [edit] and explain what your script will actually be doing and why you feel you need to be switching users so often? – terdon Jul 25 '17 at 12:26man sudo
?-v, --validate
'Update the user's cached credentials, authenticating the user if necessary. For the sudoers plugin, this extends the sudo timeout for another 15 minutes by default, but does not run a command. Not all security policies support cached credentials.' (If you run it often enough, the sudo authenticating should not timeout.) – sudodus Jul 25 '17 at 12:51sudo
. – sudodus Jul 25 '17 at 12:56sudo
calls. This long-running part is a business application that might run for weeks. The clean-up after that command then requiressudo
again. So there is no way to callsudo -v
in between. I've looked into it already. – Dakkaron Jul 25 '17 at 13:06some-command > logs/somelogfile.log
as appears quite often in my script. – Dakkaron Jul 25 '17 at 13:08&
at the end of the command line); 2) You can runsudo -H
which means that such files will be owned by root (not by your normal user ID) and it will not overwrite files for your normal user ID, but be written elsewhere, and it should work without problems (as long as you are aware of where it is and how to find it).chown ${SUDO_USER:-$USER} "messedupfile"
in the end of the script corrects at least the files back to user ownership (analog chgrp). If you NEED to start the script as sudo it helps to remediate the wrong rights and ownerships. – opinion_no9 Feb 28 '21 at 17:24