为什么`sudo cd /var/named` 不起作用?

Hoj*_*eri 221 permissions sudo

我想cd进入,/var/named但它给了我一个权限被拒绝的错误,当我想使用sudo它时,我是不允许的。这样做的技术原因是什么,是否可以通过其他方式做到这一点?

War*_*ill 321

你不能这样做的原因很简单,有两个方面

1

cd不是程序而是内置命令,sudo仅适用于程序。

sudo foo 意味着以root身份运行程序foo

sudo cd /path 返回

sudo: cd: command not found
Run Code Online (Sandbox Code Playgroud)

因为cd不是程序。

2

如果可以使用sudocd受保护的目录,那么运行该命令后,sudo cd /var/named您将以普通用户身份进入该目录,但不允许普通用户进入该目录。

这不可能。

解决方法:

您可以sudo -i用来将自己提升为超级用户。例如:

sudo -i
cd /var/named 
Run Code Online (Sandbox Code Playgroud)

您现在以 root 身份登录,可以使用任何您想要的命令。完成输入后exit,您将恢复以普通用户身份登录。

  • @kojiro Ubuntu 没有;至少在全新安装中;只有`/usr/bin/cd` 内置 (3认同)
  • @AlvinWong 为什么不试试看呢?刚刚测试过如果你`sudo -i`然后`cd`到一个你不应该在`su normal_user`中的目录然后`pwd`显示你在受保护的目录中但是`ls`不起作用`ls:无法打开目录.: 权限被拒绝` (2认同)

Bas*_*lvi 31

那是因为cd它不是可执行文件,而是用于更改目录的 shell 函数。

如果你运行:

type cd
Run Code Online (Sandbox Code Playgroud)

您将获得:

cd 是一个 shell 函数

您可以使用sudo -s来打开一个交互式 shell,然后cd转到您想要的目录:

sudo -s
cd /var/named
Run Code Online (Sandbox Code Playgroud)

要返回到您的正常外壳,只需点击Ctrl+ D


Tag*_*gar 25

以上所有答案都是正确的;不过这里有一个解决方法

sudo sh -c "cd restricted-dir; some_command"
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢这个解决方案,因为你做你的 root 工作,然后立即返回到非 root 模式,这样你就不会忘记并犯下大错误。 (4认同)

use*_*ser 18

还值得记住的是,cd尽管sudo的状态是 shell 内置或外部二进制文件,但它的工作方式是生成一个新进程来运行指定的命令

为什么这很重要?因为 sudo 的基本执行流程变得与此非常相似:

  1. shell 产生一个子进程以使用给定的参数运行 sudo
  2. sudo 对用户进行身份验证并确认其执行指定命令的权限
  3. sudo 产生一个子进程来执行指定的命令
  4. sudo 等待在步骤 3 中产生的子进程退出
  5. sudo 退出,返回 shell
  6. 步骤 1 中产生的子进程退出,将用户返回到 shell 提示符

(这在技术上可能有点不正确;有一个系统调用实际上用一个新进程(即 C 库的)替换了正在运行的进程。但是,出于本说明的目的,两者是等效的。)execve()

当您认为当前工作目录是每个进程的一个属性并且被继承但没有提升时,这变得很重要。因此,如果进程 A 衍生出一个新进程 B,那么进程 B 将从进程 A 所在的相同工作目录开始。(这就是为什么有些事情与ls ./您期望的一样平凡。)但是如果进程 B 更改工作目录,那么除非进程 A 特意寻找它,否则 A 完全不知道这种变化。(反过来,这就是为什么如果你运行类似的东西find /并在中途中止它,你最终不会在文件系统中某个看似随机的位置仅仅因为 find 在它被中止的那一刻碰巧在那里寻找.)

因此,即使sudo cd /somewhere完全按照罐头上所说的去做,到sudo退出时,您也会立即回到开始的地方。因此,从用户的角度来看,它实际上变成了空操作。事实上cd,在它执行时调用chdir()系统库函数来设置新的工作目录,这对用户没有帮助。

正如Warren Hill指出的那样,正确的解决方案(我实际上不会称其为解决方法)是使用sudo -i它让您进入一个 root shell,在那里您可以自由地浏览文件系统并执行您喜欢的任何命令。但是请注意,当您退出这个 shell 时,您仍然会回到您在目录层次结构中开始的位置,原因与我上面描述的完全相同。