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

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

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

1

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

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

sudo cd /path返回

 sudo: cd: command not found 

因为cd不是程序。

2

如果可以使用sudo cd到受保护的目录然后运行命令sudo cd /var/named那么您将作为普通用户位于该目录中,但不允许普通用户在该目录中。

这是不可能的。

解决方法:

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

 sudo -i cd /var/named 

您现在以root用户身份登录,可以使用您希望的任何命令。 完成类型exit ,您将恢复以普通用户身份登录。

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

如果您运行:

 type cd 

你会得到:

cd是一个shell函数

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

 sudo -s cd /var/named 

要返回正常的shell,只需按Ctrl + D.

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

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

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

(这在技术上 可能稍微不正确;有一个系统调用实际上新的替换正在运行的进程(这是C库的execve() )。但是,出于解释的目的,这两个是等效的。)

当您考虑当前工作目录是每个进程的属性并且是inheritance但未提升时,这一点变得很重要。 因此,如果进程A产生一个新的进程B,那么进程B从进程A所在的同一个工作目录开始。(这就是为什么像ls ./那样平凡的东西可以达到预期的效果。)但是如果进程B改变了它的工作目录,然后除非进程A不顾一切地寻找它,A完全没有意识到这种变化。 (反过来,这就是为什么如果你运行像find /这样的东西并在中途中止它,你不会在文件系统中的一些看似随机的位置结束,因为发现恰好正在那里寻找它被中止了。)

因此,即使sudo cd /somewhere完全按照它在锡上所说的那样,当sudo退出时,你就会被带到你开始的地方。 因此,从用户的角度来看,它变成了无操作。 cd正在执行时调用chdir()系统库函数来设置新的工作目录,这对用户没有帮助。

正如沃伦希尔指出的那样, 正确的解决方案 (我实际上不会称之为解决方法)是使用sudo -i将你放到root shell中,你可以自由地浏览文件系统并执行你想要的任何命令。 但是请注意,当您退出此shell时, 仍然会在目标层次结构中向后回到原点,原因与上面描述的完全相同。

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

 sudo sh -c "cd restricted-dir; some_command" 

如果您是sudo用户,也可以临时更改权限。

sudo chmod 0775路径

要么

sudo chmod + r folderpath

如有必要,请务必将其放回去。