我使用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 进入目录”。
要以普通用户(不是nginx
root 用户)的身份更改到该目录,您首先必须sudo chmod o+x nginx
.您还可以使用sudo -s
该 shell 会话启动 root shell 并访问它。
sudo cd nginx
没有多大意义。将会cd
成功,但是一旦sudo
进程退出,您将留在执行的目录中sudo
。当前工作目录是进程环境的一部分,子进程 ( sudo
) 无法更改其父进程(您的交互式 shell)的环境。