了解 Unix 权限、chmod 和 ls -la
哇!李,你为什么在写终端命令?我以为这是个前端博客呢?
听着。我包罗万象。而且,无论你在技术栈的哪个环节工作,迟早都会遇到权限问题,所以为什么不了解一下这里发生了什么呢?
行吗?行。出发吧。
为什么我无法运行这个脚本!?
假设你想在电脑上运行某个脚本。也许你是从某个地方下载的,或者从 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)。移除该组的所有权限,并移除所有其他用户的所有权限。
二进制快捷方式
现在你可以明确地设置任何你想要的文件权限了。但是,你脑子里那个小小的恶魔可能还在纠结我们之前在 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

