Skip to content

*nix 权限初探

Published: at 22:54

今天遇到了之前没遇到过的问题(倒不如说之前没遇到才是真的玄学),.ssh/authorized_keys 明明存在,但却没法免密登录。在一番搜索之后,我发现问题的关键在于权限问题。之前对权限的了解较浅,知道的也就 777644 这几个数字,平时用到的也就只有 chmod +x,正好借这个机会好好学习一下。

文件和目录的权限在 《Beginning Unix》 中位于第 67 页。简单来说,权限可以分为四种:

通过 ls -l,我们可以很方便的看到文件当前的权限配置:

值得注意的是,第一个字符代表的是“目录”的类型,有如下三种形式:

普通目录和符号链接
普通目录和符号链接

而之后的 9 个字符,则代表了三种不同用户对该文件/目录的权限。2-4 位是当前用户(user,简写为 u)的权限,5-7 位是当前用户组(group,简写为 g) 的权限,而 8-10 位则是其他用户(all,简写为 a)的权限。

权限的概念对于文件和目录而已也不尽相同。对文件而已,r 就是读取,w 就是写入,x 就是执行;而对目录而言,r 是允许读取目录及子目录中的内容,w 是允许向目录和子目录中写入,而 x 则是允许进入该目录。


现在我们知道了权限的字面表达方式,接下来就是修改了。

看了上文如果没看到 chmod 我也是没什么好说的了

chmod 命令提供了三种修改权限的方式,其按照字符划分如下:


按照上文描述的方式,我们可以很方便(?)直观(!)地修改文件和目录的权限。

等等,方便?你不觉得这么长一段很费事吗?

有吗?zsh + history 它不香吗(

于是,就有了数字表示法。其实数字表示法和上文的表示方法有简单的一一对应关系,而这种表示的本质——将其加和,实际上就是位运算:

于是我们就知道了,700 代表的实际上是 u=rwx,g=---,a=---,而 600 则是 u=rw-


回到最开始的问题:为什么 sshd 要求我们的 authorized_keys 必须为 600 权限呢?

等等,开头有这个问题吗

我的猜想是这样的:密钥,就算是公钥,也不应该被其他未经许可的用户读取(当然 root 除外);而公钥也是不需要执行的。由此,我们便需要将 ga 的权限全部取消,并且设置当前用户 u 也只能 rw。而对于 sshd 而言,通常是以 root 权限运行的(观察 /etc/systemd/system/multi-user.target.wants/ssh.service,可以发现其并没有规定用户,而不规定用户的情况下默认即为 root),因此可以直接读取内容。

当然了,这只是我的猜测。由于本人 C 语言8行,没在源码里找到佐证。

ま、それでは(