Hoj*_*eri 221 permissions sudo
我想cd进入,/var/named但它给了我一个权限被拒绝的错误,当我想使用sudo它时,我是不允许的。这样做的技术原因是什么,是否可以通过其他方式做到这一点?
War*_*ill 321
你不能这样做的原因很简单,有两个方面
cd不是程序而是内置命令,sudo仅适用于程序。
sudo foo 意味着以root身份运行程序foo
sudo cd /path 返回
sudo: cd: command not found
Run Code Online (Sandbox Code Playgroud)
因为cd不是程序。
如果可以使用sudo到cd受保护的目录,那么运行该命令后,sudo cd /var/named您将以普通用户身份进入该目录,但不允许普通用户进入该目录。
这不可能。
解决方法:
您可以sudo -i用来将自己提升为超级用户。例如:
sudo -i
cd /var/named
Run Code Online (Sandbox Code Playgroud)
您现在以 root 身份登录,可以使用任何您想要的命令。完成输入后exit,您将恢复以普通用户身份登录。
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)
use*_*ser 18
还值得记住的是,cd尽管sudo的状态是 shell 内置或外部二进制文件,但它的工作方式是生成一个新进程来运行指定的命令。
为什么这很重要?因为 sudo 的基本执行流程变得与此非常相似:
(这在技术上可能有点不正确;有一个系统调用实际上用一个新进程(即 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 时,您仍然会回到您在目录层次结构中开始的位置,原因与我上面描述的完全相同。
| 归档时间: |
|
| 查看次数: |
280069 次 |
| 最近记录: |