发布于 2026-01-06 0 阅读
0

了解 Unix 权限、chmod 和 ls -la

了解 Unix 权限、chmod 和 ls -la

安德鲁·卢拍摄的日本火车站照片(https://unsplash.com/photos/fWZ1-EEYzPM)。本文并非讨论此类火车站。

哇!李,你为什么在写终端命令?我以为这是个前端博客呢?

听着。我包罗万象。而且,无论你在技术栈的哪个环节工作,迟早都会遇到权限问题,所以为什么不了解一下这里发生了什么呢?

行吗?行。出发吧。

为什么我无法运行这个脚本!?

假设你想在电脑上运行某个脚本。也许你是从某个地方下载的,或者从 Stack Overflow 复制过来的。也许你自己写了一个脚本,谁知道呢?假设你有一个像这样的很棒的脚本:

#!/bin/bash

echo "Have a great day!"

于是你打开终端,开始运行./my-script.sh,然后看到:

$ ./my-script.sh
permission denied: ./my-script.sh

于是你打开 Stack Overflow,搜索“运行脚本权限被拒绝”之类的关键词,然后得到一个简短的答案chmod 744 <filename>。你把它复制到终端运行,并没有真正去了解 Unix 的奥秘:

$ chmod 744 ./my-script.sh
$ ./my-script.sh
Have a nice day!

你心满意足地继续你的行程,感觉你的终端机给你带来了恰当的欢迎。

然而,在你潜意识深处,你不知不觉地释放了一个微小的代码恶魔。这个小恶魔会等到你洗澡或即将入睡时——基本上就是当你终于找到那种难以企及的平静禅定状态时——它会在你脑海中低语一个问题:“这条指令是做什么的?”

你会有一瞬间纳闷自己为什么对 Unix 系统不太熟悉,怀疑自己和自己的能力,然后又把这些感觉装回潘多拉魔盒里,继续你的一天。

我的配置文件去哪儿了?

如果你编程有一段时间了,你可能已经接触过点文件(dotfiles)。也许你的项目中有一个.env用于存放 API 密钥的文件,或者你可能彻底搞砸了 Git 历史记录,而你最终决定删除.git项目中的文件夹是你最后的选择。

总之,你打开终端,运行你信赖的ls命令。

$ ls
work stuff morestuff not_file_you_want.js

真是见鬼!我的文件呢?它在 VS Code 里明明有,为什么这里没有!?

再去 Stack Overflow 查一下,你就会得到ls -la一个绿色勾选的答案,也就是:

$ ls -la
drwxr-xr-x 15 you you 4096 Apr 24 11:16 .
drwxr-xr-x 3 root root 4096 Mar 30 12:09 ..
-rw-r--r-- 1 you you 38 Apr 24 11:04 .mydotfile
drwxr-xr-x 9 you you 4096 Apr 16 09:50 work
drwxr-xr-x 9 you you 4096 Apr 13 09:50 stuff
drwxr-xr-x 9 you you 4096 Apr 11 09:50 morestuff
-rw-r--r-- 1 you you 38 Apr 24 11:04 not_file_you_want.js

成功了!我的点文件就在这里,名字也起得恰到好处.mydotfile。但是你脑子里的小恶魔又开始嘀咕了……“开头那些字母和破折号是什么意思?

啊!冒名顶替综合症!怀疑!恐惧!黑暗面!

你问自己:为什么我这么不擅长使用电脑?!

学习 Unix 权限,驱散你的疑虑!

我们先来谈谈那串奇怪的字母和破折号。

-rw-r--r-- 1 you you 38 Apr 24 11:04 .mydotfile

那串数字-rw-r-r--r--是该文件的权限列表!稍后会详细解释它的含义。

从左到右的其他信息是:指向该文件的链接数(1)、所有者、组所有者、文件大小(38)、最后修改的日期/时间以及文件名。

那么,那个字母/破折号的无稽之谈又是怎么回事呢?

-rw-r--r--

这实际上是由 4 个信息子集组成的。

type | owner | group | everyone else
------------------------------------
-    | rw-   | r--   | r--

对于文件类型,短横线表示这是一个普通文件。你会看到d表示目录,l表示链接,甚至可能在终端中看到不同的颜色来突出显示这些类型的文件。

其余列包含三项信息,分别对应系统中每个用户子集的特定权限。“所有者”是文件的创建者,“组”是所有者所属的用户组,最后一部分则列出了系统中的所有其他用户。

至于字母本身,它们分别代表 (r) 阅读 (w) 书写和 (x) 执行。因此,对于上面的例子,我们有:

type | owner | group | everyone else
------------------------------------
-    | rw-   | r--   | r--
file | read/ | read  | read
       write

这意味着您(所有者)可以读取和写入文件,但其他用户只能读取文件。

以下是您经常会在目录中看到的另一组权限:

type      | owner   | group   | everyone else
------------------------------------------
d         | rwx     | r-x     | r-x
directory | read/   | read/   | read/
            write/    execute   execute
            execute

这意味着您(再次强调,所有者)可以执行所有操作,但其他人可以读取和cd访问该目录。

更改权限

太棒了!现在你知道这些乱码字母是什么意思了吧。但是,你想不想把它们改一下呢?

让我们看一下上面运行命令时的示例目录ls -la

$ ls -la
drwxr-xr-x 15 you you 4096 Apr 24 11:16 .
drwxr-xr-x 3 root root 4096 Mar 30 12:09 ..
-rw-r--r-- 1 you you 38 Apr 24 11:04 .mydotfile
drwxr-xr-x 9 you you 4096 Apr 16 09:50 work
drwxr-xr-x 9 you you 4096 Apr 13 09:50 stuff
drwxr-xr-x 9 you you 4096 Apr 11 09:50 morestuff
-rw-r--r-- 1 you you 38 Apr 24 11:04 not_file_you_want.js

假设我们想要更改not_file_you_want.js文件的权限,并为所有者添加执行权限。

为此,我们将使用以下chmod命令:

$ chmod u+x not_file_you_want.js

这里u+x可能有点难懂,但请再仔细看看。它说的是 (u)ser + e(x)ecute,意思是给用户添加执行权限。

如果要设置更细粒度的权限呢?如果我们想移除其他所有用户的权限该怎么办?

我们可以非常具体地描述chmod

$ chmod u=rwx,g-rwx,o-rwx not_file_you_want.js

所以这条命令的意思是,用户(u)的权限应该等于读取(r)、写入(w)和执行(e)。移除该组的所有权限,并移除所有其他用户的所有权限。

二进制快捷方式

一块蓝灰色相间的标志牌,上面写着数字2。照片由Sonny Ravesteijn拍摄 (https://unsplash.com/photos/xyxjKdpUg4I)

现在你可以明确地设置任何你想要的文件权限了。但是,你脑子里那个小小的恶魔可能还在纠结我们之前在 Stack Overflow 上给出的第一个答案。

$ chmod 744 ./my-script.sh

744到底是什么意思?

这实际上是 的简写-rwxr--r--。每个数字代表一个用户子集。第一个数字(7)是用户,中间的数字是组,最后一个数字是所有其他用户,就像我们之前在分析中展示的那样:rwx | r-- | r--

每个数字实际上都是这三个权限组合的二进制表示。我们先来看用户权限:

2^2  | 2^1   | 2^0
read | write | execute
---------------------------
1    | 1     | 1

这里我们表示我们需要所有三种权限(rwx),所以我们将 2^2、2^1、2^0 相加得到 7。

对于其他组别:

2^2  | 2^1   | 2^0
read | write | execute
---------------------------
1    | 0     | 0

我们只计算 2^2,即 4,这是群组和其他权限的数量,加上我们的 7,总共是 744。

以下是一些其他常见的权限示例:

777 = 111 111 111 = rwxrwxrwx
666 = 110 110 110 = rw-rw-rw-
644 = 110 100 100 = rw-r--r--
600 = 110 000 000 = rw-------

是不是很疯狂?

所以现在当你看到这条命令时:

$ chmod 700 my-file.sh

你知道这意味着你赋予该用户所有权限,并移除其他所有人的所有权限。瞧你这Linux小天才,真厉害😎。

临别赠言

特别感谢我的同事 Clay Benson 在电话会议上为我解释了这一点。多年来,我一直盯着那些小小的字符串,rwx从未费心去查它们代表什么,只是把它们当作终端的魔法,然后就自认无知。Unix 文件权限的设计逻辑之精妙着实让我震惊,而字节运算更是让我叹为观止,也正是它激发了我写下这篇文章。

下次你在 Stack Overflow 上炫耀 Linux 技术的时候,不妨先做些研究,你可能会惊讶于自己能学到多少东西。我知道我肯定会。

文章来源:https://dev.to/leewarrickjr/understanding-unix-permissions-chmod-and-ls-la-3ekd