这篇文章记录下 Linux 中如何使用 chmod
命令修改文件以及目录的权限,也就是读/写/执行
的权限。
1. 背景需求
有时候我们使用 scp
向服务器传输文件时,会提示说 permission denied
。这是因为我们对于需要上传到的目标目录没有 写 权限。此时需要修改目标目录的读写权限,使其对于所有用户都可写(当然这种做法不推荐),这样我们才能将文件传输上去。
另外一次经历,是之前需要将自己在 windows 中的 rsa keys
传到另外一台 Linux 机器上,这样能实现 rsa keys
的复用,也方便自己在另一台 Linux 机器上能正常向 github 提交代码。
但是,当我们使用 cp
命令将 windows 上的 id_rsa
和 id_rsa.pub
直接拷贝到 ~/.ssh
目录下,然后使用 ssh 时,会提示说 私钥的安全性不够,很容易被访问到
。这时候就需要修改私钥文件和公钥文件的权限,以满足要求。
具体需要执行下面两条语句:
1 | chmod 600 id_rsa |
这两条命令有什么含义,继续往后看。
2. chmod
命令的使用
Linux 中我们可以通过 ll
命令来查看文件和目录的权限。这里需要提一下,Linux 中并没有提供 ll
命令,这个命令是通过 alias
实现的。alias
的使用可以参考我上一篇博客:利用 alias 自定义一个删除备份命令
以我自己的服务器 home 目录为例,当我直接输入 ll
命令时,结果:
1 | ubuntu@VM-0-14-ubuntu:~$ ll |
我们也可以单独查看某个文件或目录的权限:
1 | ll test_bash.sh |
结果:
1 | ubuntu@VM-0-14-ubuntu:~$ ll test_bash.sh |
输出的第一列 -rwxrwxrwx
就表示文件或目录的权限,下面详细解释。
第一位表示文件的类型:
-
:表示普通文件;d
:表示目录,即directory
。
后面的 9 位按照 属主
/ 组用户(group)
/ 其它用户
的顺序排列权限,每种用户的权限占据 3 位。
其中:
r
表示可read
,用二进制表示为100
,用八进制表示为4
;w
表示可write
,用二进制表示为010
,用八进制表示为2
;x
表示可execute
,用二进制表示为001
,用八进制表示为1
。
如果某个位置为 -
表示该用户不具有此权限。以 drwxr-xr-x
为例:
- 第一个
rwx
表示属主
具有 read/write/execute 权限; - 第二个
r-x
表示组用户
具有 read/execute 权限,但是没有 write 权限; - 第三个
r-x
表示其它用户
具有 read/execute 权限,但是没有 write 权限。
drwxr-xr-x
也可以用二进制来表示,即 111-101-101
,转换为八进制即 755
。755
和 drwxr-xr-x
表示同样的意思。
搞清楚了上面的解释,那么当我们需要将一个文件 test.txt
的权限设置成:属主可以 read/write,组用户和其他用户都只能 read 时(用二进制表示为 110-100-100
),我们可以这么做:
1 | chmod 644 test.txt |
最后,让我们再回过头来看背景需求部分介绍的 rsa keys
的权限问题:
1 | chmod 600 id_rsa |
- 第一行表示将私钥文件
id_rsa
设置为属主可 read/write,组用户和其他用户都不能 read/write/execute,这符合私钥文件的要求,即只有属主能访问到,属主之外的用户都无法访问; - 第二行表示将公钥文件
id_rsa.pub
设置为属主可 read/write,组用户和其他用户都能 read。这也符合要求,即属主之外的用户可以利用属主的公钥来加密。