我想将cd转换为/var/named,但它给了我一个权限被拒绝的错误,当我想使用sudo进行此操作时,我是不允许的。造成这种情况的技术原因是什么,是否可以通过其他方式进行?

#1 楼

无法执行此操作的原因很简单,并且有两个原因
1
cd不是程序,而是内置命令,而sudo仅适用于程序。以root身份
sudo foo返回
sudo: cd: command not found

,因为sudo cd /path不是程序。
2
如果可以将sudo应用于cd到受保护的目录,则运行命令cd,您将以普通用户身份进入该目录,但不允许普通用户进入该目录。
这是不可能的。超级用户。例如:
sudo -i
cd /var/named 

您现在以root用户身份登录,可以使用所需的任何命令。完成后,键入sudo cd /var/named,您将回到以普通用户身份登录。

评论


从技术上讲,cd既是内置命令,又是外部命令。 unix.stackexchange.com/questions/50058/…

– kojiro
13年5月7日在6:55

@kojiro Ubuntu没有;至少是全新安装;仅具有/ usr / bin / cd内置

–沃伦·希尔
13年5月7日在7:23

关于第二点:如果您使用sudo -i(或sudo su),则先使用cd / var / named,然后再使用su normaluser ...可以吗?

–黄永Al
13年5月7日在8:31

@AlvinWong为什么不尝试并找出答案?刚刚测试过,如果您将sudo -i然后cd转到目录,则不应将其放在su normal_user中,然后pwd将显示您位于受保护的目录中,但是ls无效ls:无法打开目录。

–沃伦·希尔
13年5月7日在9:03

@BalmanRawat sudo echo运行/ bin / echo而不是内置的echo shell。

– Eliah Kagan
17年12月11日在0:38

#2 楼

这是因为cd不是可执行文件,它是更改目录的Shell函数。

如果运行: br />

cd是一个shell函数


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

type cd


要返回正常的外壳,只需按Ctrl + D。

评论


由于您不能使用sudo cd foo,因此也不能使用sudo type foo,因为它是内置的shell。

– MAChitgarha
19年2月1日在5:31

#3 楼

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

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


评论


我最喜欢此解决方案,因为您先做基础工作,然后立即返回非root模式,这样您就不会忘记并犯下大错。

– GlenPeterson
16年8月25日在19:50

这个命令对我没有用

–约翰
20年1月21日在1:23

#4 楼

还值得记住的是,尽管cd的状态是内置的shell或外部二进制文件,但sudo会通过生成新进程来运行指定的命令而起作用。因为sudo的基本执行流程与此非常相似:


Shell产生了一个子进程以使用给定的参数运行sudo
sudo产生一个子进程来执行指定命令
sudo等待在步骤3中产生的子进程退出
sudo退出,返回到外壳
步骤1中的子流程退出,将用户返回到shell提示符
C库的execve())。但是,出于解释的目的,两者是等效的。)

当您认为当前工作目录是每个进程的属性并且被继承但不继承时,这一点很重要晋升。因此,如果进程A产生了一个新的进程B,那么进程B将从进程A所在的工作目录开始。(这就是为什么ls ./这样平凡的东西可以达到您的期望。)但是,如果进程B改变了它的工作目录,那么除非进程A尽力寻找该目录,否则A完全不知道该更改。 (因此,这就是为什么如果您运行类似find /的内容并中途中止它,那么您不会因为文件查找恰巧在文件系统中的位置而出现在文件系统中看似随机的位置的原因已中止。)

因此,即使sudo cd /somewhere完全按照锡盒上的说明操作,到sudo退出时,您也将被带回到起点。因此,从用户的角度来看,它实际上是无人值守的。 cd在执行时调用了chdir()系统库函数来设置新的工作目录这一事实,对用户没有帮助。

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

评论


这个解释很好,您的意思是“因此,即使sudo cd / somewhere完全按照锡上的说明进行操作,到sudo退出时,您也将回到开始的位置。”是有帮助的。 +1

–哈珀维尔
16/12/20在15:14



#5 楼

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

sudo chmod 0775路径




请确保在必要时将其放回。

评论


欢迎来到Ask Ubuntu!我建议编辑此答案以使用有关此操作的特定详细信息将其扩展。 (另请参阅如何写一个好的答案?有关在AskUbuntu上认为哪种答案最有价值的一般建议。)

–大卫·福斯特(David Foerster)
16年11月7日在18:03

我没有使用sudo运行交互式shell的权利,所以这是正确的方法。

–纪尧姆
17年9月19日在9:45