How to elevate privileges to root in
bash? And then how to return back to exactly the previous state? My question is both about elevating/decreasing privileges and possible troubles with some apps, especially GUI apps (and an “environment”).
Say, some apps keep a separate profile for each user and root. GUI & profiles may be not the only problem with an “environment” if I run an app as root, regardless of whether this is their or OS’s bug or a feature.
Say, I need to run a script as root or already run a script as root (like in rc.local), so you might need to decrease the privileges or "completely" switch back to the normal user from there (
su normaluser does not always work). To run initially a script with
sudo -H and then to switch to another user? This does not always work as needed especially with GUI apps. I believe the trouble is with an "environment", and
DISPLAY=:0 ... or
DISPLAY=:0 gtk-launch ... (
gtk-launch is likely bugged) may be yet not helpful.
Say, I have
gedit with an opened document. If I run as just a normal user
gedit /doc2, it opens with menu visible and in the already existing window in another tab. If I run it as root, it opens up in a separate window and without visible menu. If I run a script through
sudo -H or
su and try to run
gedit /doc2 there as that normal user (again with sudo (-H) or su), then it works as if I did that as root, not that normal user. I tried also
-l, -s, -i. With other GUI apps that caused far more serious troubles. Some GUI apps have different GUI or don’t run at all as a result.
runuser was helpful for me but not always. And heredoc format (
sudo -H /bin/bash <<EOF <lines with commands> EOF) does not work as expected.
It is how many troubles this makes. For more than 1 year I could not find a good universal solution. So is there anything for elevation of privileges and returning back? Or other good workarounds?
And a full example just in case (run as
sudo ./script.sh or with
cd /somedir some_commands # using the current directory, root privileges and setting some variables, and writing to somefile (better as normal user) sudo -u normaluser /bin/bash -c 'gedit --encoding someencoding /somefile'`
If I run the following bash script as just
gedit --encoding someencoding /somefile
gedit works as it should.
Just in case: it is about Ubunu 16.04 xenial, bash version 4.3.48.
I know I could run commands like
sudo sh -c ‘command1 $somevariable; command2’
or (I've found out it can be several lines)
sudo sh -c ‘command1 $somevariable command2’
or maybe something similar with
bash. That might not be an option for a large set of commands and does not solve all the problems. And I absolutely don’t need to enter commands interactively. See also my answer.
P.S. I think Linux should user-friendly and easy to use.