无法使用 sudo 访问文件夹

无法使用 sudo 访问文件夹

我使用Linux已经两年了,但是今天我遇到了一件很奇怪的事情。我在一台服务器上部署了 nginx,这是它的日志文件夹:

♪ log l -d nginx drwx------ 2 nginx nginx 4.0K Dec 7 03:15 nginx

(我使用的是 zsh,这♪ log意味着我位于名为“log”的文件夹中。如您所见,我最终说我没有进入名为“nginx”的文件夹。)

当我尝试访问它时:

♪ log cd nginx cd: permission denied: nginx ♪ log sudo cd nginx ♪ log

即使我将其权限更改为766后,该文件夹仍然无法访问:

♪ log sudo chmod -R 766 nginx ♪ log l -d nginx drwxrw-rw- 2 nginx nginx 4.0K Dec 7 03:15 nginx ♪ log cd nginx cd: permission denied: nginx ♪ log sudo cd nginx ♪ log

谁可以给我解释一下这个?

答案1

主要原因是sudo cd nginx进入了nginx文件夹又退出了。因此,您将返回到启动命令之前的先前状态sudo

这与示例中的操作相同sudo ls nginx/*,它将列出并退出的内容nginx folder

sudo生成一个具有请求的权限并运行请求的命令的新进程。命令完成后,sudo 退出,您将回到之前的情况。

要深入了解,您必须了解文件系统内的位置是由您正在使用的 shell 程序动态管理的。当进程被分叉时,shell 上下文将被复制到新进程中。对复制上下文的每次操作都是特定于它的,并且不会影响父上下文。因此,在我们的例子中,cd nginx修改的是$PWD新进程的进程,而不是父进程的进程。一旦完成,相关上下文将被销毁,然后,您将回退到未修改的父上下文中。

正如另一个家伙向您解释的那样,为了能够移动到文件夹中,您还需要具有执行权限(+x)。

答案2

用户必须拥有目录的执行权限才能对其进行更改。

参见例如问题“cd 进入目录”。

要以普通用户(不是nginxroot 用户)的身份更改到该目录,您首先必须sudo chmod o+x nginx.您还可以使用sudo -s该 shell 会话启动 root shell 并访问它。


sudo cd nginx没有多大意义。将会cd成功,但是一旦sudo进程退出,您将留在执行的目录中sudo。当前工作目录是进程环境的一部分,子进程 ( sudo) 无法更改其父进程(您的交互式 shell)的环境。

相关内容