这篇文章记录下 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。这也符合要求,即属主之外的用户可以利用属主的公钥来加密。