I'm writing a bash script that needs to sudo multiple commands. I can do this:
( whoami ; whoami )
but I can't do this:
sudo ( whoami ; whoami )
How do I solve this?
The su command lets you switch the current user to any other user. If you need to run a command as a different (non-root) user, use the –l [username] option to specify the user account. Additionally, su can also be used to change to a different shell interpreter on the fly.
You can pass the commands as standard input into sudo'ed bash with a here document:
sudo bash <<"EOF" whoami id EOF
This way there is no need to fiddle with correct quoting, especially if you have multiple levels, e.g.:
sudo bash <<"EOF" whoami echo $USER ~ sudo -u apache bash <<"DOF" whoami echo $USER ~ DOF EOF
Produces:
root root /root apache apache /usr/share/httpd
(Note that you can't indent the inner terminator — it has to be alone on its line. If you want to use indentation in a here document, you can use <<-
instead of <<
, but then you must indent with tabs, not spaces.)
Run a shell inside sudo
: sudo bash -c 'whoami; whoami'
You can use any character except '
itself inside the single quotes. If you really want to have a single quote in that command, use '\''
(which technically is: end single-quote literal, literal '
character, start single-quoted literal; but effectively this is a way to inject a single quote in a single-quoted literal string).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With