须藤与根;任何实际差异?

Ran*_*ger 49 linux root sudo command-line

我正在与一个产品的支持成员一起工作,他坚持说我需要成为 root 才能安装一系列补丁,而 sudo 不起作用;他没有提供任何理由,但他的信念似乎非常坚定。浏览超级用户我无法确定出现这种情况的任何可能原因,并确认,当我运行时:

sudo -l
Run Code Online (Sandbox Code Playgroud)

我得到:

...
User [MY USERNAME] may run the following commands on this host:
    (ALL) ALL
Run Code Online (Sandbox Code Playgroud)

据我所知,从 Linux/服务器团队获得真正的 root 访问权限并不是一个直接的过程,所以我更愿意自己安装它们。

是否有任何实际原因为什么 sudo 在服务器上安装软件时的行为与 root 不同?

Has*_*tur 36

这在很大程度上取决于您如何使用sudo或调用您的程序su
例如,在我现在所在的系统上:

                  .bashrc                        
    COMMAND        $HOME   $USER  Env.  $PATH
 1. sudo -i        (root)   root  root  [1]
 2. sudo -s        (USER)   root  USER  /home/${USER}/bin:[1]
 3. sudo /bin/bash (USER)   root  USER  /home/${USER}/bin:[1]  
 4. sudo su        (root)   root  USER  [1]:/usr/games:/usr/local/games  
 5. sudo su -      (root)   root  root  [1] 
Run Code Online (Sandbox Code Playgroud)

其中 [1]=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Env=环境变量被重置为 1 和 5,取自 $USER in 2、3、4。

因此,使用不同选项启动的脚本或程序可以看到不同的$PATH, $HOME,其外壳可以读取不同的.bashrc,.profile和 环境变量。它读取与$HOME. 每个用户都可以以不同的方式修改他的环境(变量$PATH、.bashrc、.profile、.bash_profile、别名...)。特别是用户可以在他的目录中拥有不同的目录顺序,$PATH因此,脚本可以执行命令,例如 in/home/$USER/bin而不是从 root 期望的路径中的命令。

您可以在sudo -i以 root 身份登录时使用运行该程序su -,但如果使用sudo MyCommand或运行它,则可能会有不同的行为su -c MyCommand


来自man su

在描述部分:
将当前环境传递给新的 shell$PATH的值对于普通用户重置为 /bin:/usr/bin,对于超级用户重置为 /sbin:/bin:/usr/sbin:/usr/bin
...
在选项部分:
- , -l , --login
提供类似于用户直接登录时所期望的环境

从人 sudo

-i , --login
运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着 shell 将读取特定于登录名的资源文件,例如 .profile 或 .login。如果指定了命令,则会通过 shell 的 -c 选项将其传递给 shell 以执行。如果未指定命令,则执行交互式 shell。 sudo在运行 shell 之前尝试更改到该用户的主目录。 该命令的运行环境类似于用户在登录时会收到的环境。sudoers(5) 手册中的命令环境部分记录了 -i 选项如何影响在使用 sudoers 策略时运行命令的环境。


sds*_*sds 24

如果您具有完全sudo访问权限,则可以root使用sudo su -,因此安全点没有实际意义。

事实上,有一种方法可以区分程序运行方式root和程序运行方式之间的区别sudo- 使用getuidvs geteuid- 但这是一个人为的技巧。为什么补丁系统会这样做?

  • 说到`su -`,他可能想使用`sudo -i`,这样他就有和直接登录时一样的环境。 (5认同)
  • 如果您使用例如`sudo myscript` 运行,您将从您所在的shell 中保留$PATH 和环境变量。如果你使用 `sudo -i myscript` 运行,你就像以 root 身份登录一样运行。通过我们的 [_zoo of call :-) _](http://superuser.com/a/771523/257269) 查看答案 (2认同)
  • sds,@CharlesDuffy:sudo 和 su 导致 `geteuid()` 和 `getuid()` 彼此不同的想法*是一个神话。* su 和 sudo 将真实和有效用户 ID 更改为在运行指定的命令或 shell 之前目标用户,除非在非常不寻常的情况下,您已经明确地将它们配置为其他行为。您可以通过运行 `sudo id -u` 和 `sudo id -ru`(均显示 0),阅读 [sudo(8)](http://www.sudo.ws/sudo/man) 来验证这一点(对于 sudo) /1.8.10/sudo.man.html)(在 *COMMAND EXECUTION* 下),或 [编写测试程序](http://paste.ubuntu.com/8383029/)。 (2认同)

Jay*_*yen 7

正如@Hastur 所指出的,如果您获得的是 root shell,则存在一些差异。

如果您没有获得 root shell,则存在更多差异。支持成员可能有尝试执行诸如以 root 身份运行sudo patch -p0 < /root/patch.filewhere 之类的事情的经验patch,但<(从文件中传输)则不然。