如何在bash中提升root权限并返回?

J. *_*ver 0 gui bash sudo su cd-command

如何提升root权限bash?那么如何回到之前的状态呢?我的问题是关于提升/降低权限以及某些应用程序可能出现的问题,尤其是 GUI 应用程序(和 \xe2\x80\x9cenvironment\xe2\x80\x9d)。

\n\n

例如,某些应用程序为每个用户和 root 保留单独的配置文件。如果我以 root 身份运行应用程序,GUI 和配置文件可能不是 \xe2\x80\x9cenvironment\xe2\x80\x9d 的唯一问题,无论这是他们的还是 OS\xe2\x80\x99s 的错误还是功能。

\n\n

比如说,我需要以 root 身份运行脚本或已经以 root 身份运行脚本(如在 rc.local 中),因此您可能需要降低权限或从那里“完全”切换回普通用户(su normaluser并不总是有效) )。最初运行一个脚本,sudo -H然后切换到另一个用户?这并不总是能按需要工作,尤其是对于 GUI 应用程序。我相信问题出在“环境”上,或者DISPLAY=:0 ...DISPLAY=:0 gtk-launch ...可能gtk-launch被窃听)可能还没有帮助。

\n\n

比如说,我有gedit一个打开的文档。如果我以普通用户身份运行gedit /doc2,它将打开,菜单可见,并且位于另一个选项卡中现有的窗口中。如果我以 root 身份运行它,它将在一个单独的窗口中打开,并且没有可见的菜单。sudo -H如果我通过or运行脚本su并尝试gedit /doc2以普通用户身份运行(再次使用 sudo (-H) 或 su),那么它的工作方式就好像我以 root 身份而不是普通用户那样运行。我也尝试过sudo选项-l, -s, -i。对于其他 GUI 应用程序来说,这会造成更严重的问题。某些 GUI 应用程序具有不同的 GUI,或者因此根本无法运行\xe2\x80\x99。\n有时runuser对我有帮助,但并非总是如此。并且 Heredoc 格式 ( sudo -H /bin/bash <<EOF <lines with commands> EOF) 无法按预期工作。

\n\n

这造成了多少麻烦。一年多来我找不到一个好的通用解决方案。那么有没有什么可以提升特权并返回呢?或者其他好的解决方法?

\n\n

还有一个完整的示例,以防万一(以sudo ./script.sh或 with运行-H):

\n\n
cd /somedir\nsome_commands # using the current directory, root privileges and setting some variables, and writing to somefile (better as normal user)\nsudo -u normaluser /bin/bash -c \'gedit --encoding someencoding /somefile\'`\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我运行以下 bash 脚本./script.sh

\n\n
gedit --encoding someencoding /somefile\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后gedit可以正常工作了。

\n\n

以防万一:它是关于 Ubunu 16.04 xenial,bash 版本 4.3.48。

\n\n

更新

\n\n

我知道我可以运行这样的命令

\n\n
sudo sh -c \xe2\x80\x98command1 $somevariable; command2\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者(我发现它可以是几行)

\n\n
sudo sh -c \xe2\x80\x98command1 $somevariable command2\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者也许与 类似的东西bash。对于大量命令来说,这可能不是一个选项,并且不能解决所有问题。而且我绝对不需要\xe2\x80\x99 交互输入命令。另请参阅我的回答。

\n\n

PS我认为Linux应该是用户友好且易于使用的。

\n

Leo*_*Mew 5

要提升脚本中少数命令的权限,请使用 sudo 和 heredoc 语法:

possiblevariable=something    
sudo /bin/bash <<EOF
    cd /somedir
    pwd
    commandasroot1 "$possiblevariable"
    commandasroot2
EOF
nonrootcommand (and not in /somedir)
Run Code Online (Sandbox Code Playgroud)

测试cd:(工作目录在heredoc内更改,但在heredoc结束时恢复为之前的状态)

leonid@DevSSD:~$ sudo bash <<EOF
> cd /tmp
> pwd
> EOF
[sudo] password for leonid: 
/tmp
leonid@DevSSD:~$ 
Run Code Online (Sandbox Code Playgroud)

再举一个例子,展示变量替换在 Heredoc 中的工作原理:

leonid@DevSSD:~$ sudo bash <<EOF
    cd /tmp
    echo $PWD; echo \$PWD
EOF
[sudo] password for leonid: 
/home/leonid
/tmp
leonid@DevSSD:~$ 
Run Code Online (Sandbox Code Playgroud)

更新:示例如何将输出放入变量中

leonid@DevSSD:~$ variable=$(sudo bash <<EOF
    cd /tmp
    echo $PWD; echo \$PWD
EOF
)
[sudo] password for leonid: 
leonid@DevSSD:~$ echo $variable
/home/leonid /tmp
Run Code Online (Sandbox Code Playgroud)