sudo 和 sudo -i 之间的权限区别是什么?
有了sudo
它
$sudo echo "search foo.bar.baz" >> /etc/resolv.conf
bash: /etc/resolv.conf: Permission denied
...与sudo -i
$sudo -i
#echo "search foo.bar.baz" >> /etc/resolv.conf
...成功了。权限如下:
drwxr-xr-x 166 root root 12288 2009-10-17 21:02 .
-rw-r--r-- 1 root root 42 2009-10-17 20:55 /etc/resolv.conf
我很惊讶这些命令有不同的行为,是什么原因导致刚刚的sudo
版本失败?
答案1
在第一个示例中,重定向发生在当前 shell 中,而不是 sudo 子 shell 中。因此,sudo
执行echo "search foo.bar.baz"
并将结果返回到当前 shell,然后尝试将其写入/etc/resolv.conf
。
bash
您可以通过直接调用 sudo 命令来使第一个示例正常工作:
sudo bash -c "echo 'search foo.bar.baz' >> /etc/resolv.conf"
答案2
使用 ,sudo
您可以使用具有管理员权限的 1 条命令。
使用 ,sudo -i
您将使用自己的 shell 和环境变量登录到 root 帐户。
否则,您可以使用sudo -s
,使用它,您将登录到 root 帐户,但您仍可以使用自己的 shell 和变量。
问题是,sudo -i
您可能会获得另一个 shell 和另一个 $PATH,这可以解决问题。
答案3
来自 sudo 手册页:
-i The -i (simulate initial login) option runs the shell specified in
the passwd(5) entry of the user that the command is being run as.
The command name argument given to the shell begins with a ‘-’ to
tell the shell to run as a login shell. sudo attempts to change to
that user’s home directory before running the shell. It also ini‐
tializes the environment, leaving TERM unchanged, setting HOME,
SHELL, USER, LOGNAME, and PATH, and unsetting all other environment
variables. Note that because the shell to use is determined before
the sudoers file is parsed, a runas_default setting in sudoers will
specify the user to run the shell as but will not affect which
shell is actually run.
您遇到的问题是 shell 仅将 sudo 应用于您构建的管道的第一部分。>> etc
以您的权限而不是 root 身份运行。