为什么`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的基本执行流程变得非常类似于:
- shell生成一个子进程以使用给定的参数运行sudo
- sudovalidation用户并确认他们执行指定命令的权限
- sudo生成一个子进程来执行指定的命令
- sudo等待在第3步中生成的子进程退出
- sudo退出,返回shell
- 退出步骤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
如有必要,请务必将其放回去。