标签 chmod 下的文章

不要让文件权限拖你后腿。以下是在 Linux 和 macOS 上管理它们的方法。

如果你通过网络或“跑腿网络”(将文件保存到硬盘,以将其复制到一台计算机)在两个用户之间共享文件,那么在尝试读取或写入文件时可能会遇到权限错误。即使你了解它的概念,你也可能不知道该如何诊断或解决问题。我曾经将数据迁移作为一项服务执行,因此我遇到了相当多的权限错误和所有权冲突。这是我快速修复它们的方法。

1、确定正确的用户

在修复权限错误之前,你必须确定需要权限的人是谁。你可能认为你已经知道这一点,但你可能没有意识到用户名并不是用户身份的最确定属性。你的计算机不会将你视为一个人,而是将你视为一个数字。要了解你的号码,请查看你的用户 ID:

$ id --user
1005

2、获取当前所有者

接下来,确定你无法与之交互的文件的所有者。由于发生了文件权限问题,你可能需要使用 sudo 命令查看有关文件的信息:

$ sudo ls --numeric-uid-gid
-rw------- 1 1000 100  23041 Aug  2 05:26 bar
-rw------- 1 1000 100  54281 Aug  2 04:58 baz
-rw------- 1 1000 100    822 Aug  2 08:19 foo

在此示例中,拥有文件的用户被标识为用户 ID 1000,这就是用户 ID 1005 无法与它们交互的原因。更糟糕的是,这些文件标记为仅由拥有它们的用户可读和可写,因此即使是同一组的成员也不能与这些文件进行交互。

3、更改权限以匹配

你知道需要权限的用户,因此你可以更改当前所有者以匹配你当前的用户:

$ sudo chown 1005 foo

你还可以通过更改文件模式授予你的组成员以及系统上可能的其他用户对文件的访问权限。例如,在向组和任何其他用户授予读取权限(4)的同时保持读取和写入权限(7):

$ sudo chmod 744 foo

了解更多

当你对文件权限不熟悉时,它们似乎很棘手。有关文件所有权如何工作的更多信息,请阅读 chown 简介


via: https://opensource.com/article/22/8/fix-file-permission-errors-linux

作者:Seth Kenlon 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

当提到文件和目录的权限时,你的第一反应可能是“属主/群组/其它”权限。 这些权限可以通过 chmodchown 等命令来修改。

文件和目录都有属主 (文件所有者 )、群组 (所属组) 以及其它权限,这些权限构成一个集合。 然而这些权限集合有它的局限性,无法做到为不同的用户设置不同的权限。

Linux 对文件和目录有以下默认权限。

  • 文件 -> 644 -> -rw-r-r- (所有者有读写权限,组成员有只读权限, 其他人也只有读权限)
  • 目录 -> 755 -> drwxr-xr-x (所有者有读、写和执行权限,组成员有读和执行的权限,其他人也有读和执行的权限)

比如: 默认情况下,所有者可以访问和编辑他们自己主目录中的文件, 也可以访问相关同组人的文件,但他们不能修改这些文件,因为组成员没有写权限,而且让组成员有写权限也是不明智的。 基于同样的原因,他/她也不能修改其他人的文件。 然而在某些情况下,多个用户想要修改同一个文件, 那该怎么办呢?

假设有个名叫 magi 的用户,他想要修改 httpd.conf 文件怎么办呢? 这个文件是归 root 用户所有的,这样如何授权呢? 为了解决这种情况, 访问控制列表 Access Control List (ACL)诞生了。

什么是 ACL?

ACL 表示 访问控制列表 Access Control List (ACL),它为文件系统提供了附加的、更具有弹性的权限机制。 它被设计来为补充 UNIX 文件权限机制。 ACL 允许你赋予任何某用户/组访问某项资源的权限。 setfaclgetfacl 命令会帮助你管理 ACL 而不会有任何麻烦。

什么是 setfacl?

setfacl 用于设置文件和目录的 ACL。

什么 getfacl?

getfacl - 获取文件的 ACL 。对于每个文件, getfacl 都会显示文件名、文件所有者、所属组以及ACL。 如果目录有默认 ACL, getfacl 也会显示这个默认的 ACL。

如何确认是否启用了 ACL?

运行 tune2fs 命令来检查是否启用了 ACL。

# tune2fs -l /dev/sdb1 | grep options
Default mount options: (none)

上面的输出很明显第说明 /dev/sdb1 分区没有启用 ACL。

如果结果中没有列出 acl,则你需要在挂载选项中加上 acl。 为了让它永久生效, 修改 /etc/fstab/app 这一行成这样:

# more /etc/fstab

UUID=f304277d-1063-40a2-b9dc-8bcf30466a03 / ext4 defaults 1 1
/dev/sdb1        /app ext4 defaults,acl 1 1

或者,你也可以使用下面命令将其添加道文件系统的超级块中:

# tune2fs -o +acl /dev/sdb1

现在,通过运行以下命令来动态修改选项:

# mount -o remount,acl /app

再次运行 tune2fs 命令来看选项中是否有 acl 了:

# tune2fs -l /dev/sdb1 | grep options
Default mount options: acl

嗯,现在 /dev/sdb1 分区中有 ACL 选项了。

如何查看默认的 ACL 值

要查看文件和目录默认的 ACL 值,可以使用 getfacl 命令后面加上文件路径或者目录路径。 注意, 当你对非 ACL 文件/目录运行 getfacl 命令时, 则不会显示附加的 usermask 参数值。

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
group::r--
other::r--

如何为文件设置 ACL

以下面格式运行 setfacl 命令可以为指定文件设置 ACL。在下面的例子中,我们会给 magi 用户对 /etc/apache2/apache2.conf 文件 rwx 的权限。

# setfacl -m u:magi:rwx /etc/apache2/apache2.conf

仔细分析起来:

  • setfacl: 命令
  • -m: 修改文件的当前 ACL
  • u: 指明用户
  • magi: 用户名
  • rwx: 要设置的权限
  • /etc/apache2/apache2.conf: 文件名称

再查看一次新的 ACL 值:

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
user:magi:rwx
group::r--
mask::rwx
other::r--

注意: 若你发现文件或目录权限后面有一个加号(+),就表示设置了 ACL。

# ls -lh /etc/apache2/apache2.conf
-rw-rwxr--+ 1 root root 7.1K Sep 19 14:58 /etc/apache2/apache2.conf

如何为目录设置 ACL

以下面格式运行 setfacl 命令可以递归地为指定目录设置 ACL。在下面的例子中,我们会将 /etc/apache2/sites-available/ 目录中的 rwx 权限赋予 magi 用户。

# setfacl -Rm u:magi:rwx /etc/apache2/sites-available/

其中:

  • -R: 递归到子目录中

再次查看一下新的 ACL 值。

# getfacl /etc/apache2/sites-available/

# file: etc/apache2/sites-available/
# owner: root
# group: root
user::rwx
user:magi:rwx
group::r-x
mask::rwx
other::r-x

现在 /etc/apache2/sites-available/ 中的文件和目录都设置了 ACL。

# ls -lh /etc/apache2/sites-available/
total 20K
-rw-rwxr--+ 1 root root 1.4K Sep 19 14:56 000-default.conf
-rw-rwxr--+ 1 root root 6.2K Sep 19 14:56 default-ssl.conf
-rw-rwxr--+ 1 root root 1.4K Dec 8 02:57 mywebpage.com.conf
-rw-rwxr--+ 1 root root 1.4K Dec 7 19:07 testpage.com.conf

如何为组设置 ACL

以下面格式为指定文件运行 setfacl 命令。在下面的例子中,我们会给 appdev 组赋予 /etc/apache2/apache2.conf 文件的 rwx 权限。

# setfacl -m g:appdev:rwx /etc/apache2/apache2.conf

其中:

  • g: 指明一个组

对多个用户和组授权,只需要用 逗号 区分开,就像下面这样。

# setfacl -m u:magi:rwx,g:appdev:rwx /etc/apache2/apache2.conf

如何删除 ACL

以下面格式运行 setfacl 命令会删除文件对指定用户的 ACL。这只会删除用户权限而保留 mask 的值为只读。

# setfacl -x u:magi /etc/apache2/apache2.conf

其中:

  • -x: 从文件的 ACL 中删除

再次查看 ACL 值。在下面的输出中我们可以看到 mask 的值是读。

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

使用 -b 来删除文件中所有的 ACL。

# setfacl -b /etc/apache2/apache2.conf

其中:

  • -b: 删除所有的 ACL 条目

再次查看删掉后的 ACl 值就会发现所有的东西都不见了,包括 mask 的值也不见了。

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
group::r--
other::r--

如何备份并还原 ACL

下面命令可以备份和还原 ACL 的值。要制作备份, 需要进入对应的目录然后这样做(假设我们要备份 sites-available 目录中的 ACL 值)。

# cd /etc/apache2/sites-available/
# getfacl -R * > acl_backup_for_folder

还原的话,则运行下面命令:

# setfacl --restore=/etc/apache2/sites-available/acl_backup_for_folder

via: https://www.2daygeek.com/how-to-configure-access-control-lists-acls-setfacl-getfacl-linux/

作者:Magesh Maruthamuthu 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 中最基本的任务之一就是设置文件权限。理解它们是如何实现的是你进入 Linux 世界的第一步。如您所料,这一基本操作在类 UNIX 操作系统中大同小异。实际上,Linux 文件权限系统就直接取自于 UNIX 文件权限(甚至使用许多相同的工具)。

但不要以为理解文件权限需要长时间的学习。事实上会很简单,让我们一起来看看你需要了解哪些内容以及如何使用它们。

基础概念

你要明白的第一件事是文件权限可以用来干什么。当你设置一个分组的权限时发生了什么?让我们将其展开来说,这个概念就真的简单多了。那到底什么是权限?什么是分组呢?

你可以设置的3种权限:

  • 读 — 允许该分组读文件(用r表示)
  • 写 — 允许该分组写文件(用w表示)
  • 执行 — 允许该分组执行(运行)文件(用x表示)

为了更好地解释这如何应用于一个分组,例如,你允许一个分组可以读写一个文件,但不能执行。或者,你可以允许一个分组读和执行一个文件,但不能写。甚至你可以允许一个分组有读、写、执行全部的权限,也可以删除全部权限来去除该组的权限。

现在,什么是分组呢,有以下4个:

  • user — 文件实际的拥有者
  • group — 用户所在的用户组
  • others — 用户组外的其他用户
  • all — 所有用户

大多数情况,你只会对前3组进行操作,all 这一组只是作为快捷方式(稍后我会解释)。

到目前为止很简单,对吧?接下来我们将深入一层。

如果你打开一个终端并运行命令 ls -l,你将会看到逐行列出当前工作目录下所有的文件和文件夹的列表(如图)

你会留意到最左边那列是像是 -rw-rw-r-- 这样的。

实际上这列表应该这样看:

rw- rw- r--

正如你所见,列表将其分为如下3部分:

  • rw-
  • rw-
  • r--

权限和组的顺序都很重要,顺序总是:

  • 所属者 所属组 其他人 — 分组
  • 读 写 执行 — 权限

在我们上面示例的权限列表中,所属者拥有读/写权限,所属组拥有读/写权限,其他人用户仅拥有读权限。这些分组中赋予执行权限的话,就用一个 x 表示。

等效数值

接下来我们让它更复杂一些,每个权限都可以用一个数字表示。这些数字是:

  • 读 — 4
  • 写 — 2
  • 执行— 1

数值代替不是一个一个的替换,你不能像这样:

-42-42-4--

你该把每个分组的数值相加,给用户读和写权限,你该用 4 + 2 得到 6。给用户组相同的权限,也是使用相同的数值。假如你只想给其他用户读的权限,那就设置它为4。现在用数值表示为:

664

如果你想给一个文件664权限,你可以使用 chmod 命令,如:

chmod 664 FILENAME

FILENAME 处为文件名。

更改权限

既然你已经理解了文件权限,那是时候学习如何更改这些权限了。就是使用 chmod 命令来实现。第一步你要知道你能否更改文件权限,你必须是文件的所有者或者有权限编辑文件(或者通过 susudo 得到权限)。正因为这样,你不能随意切换目录和更改文件权限。

继续用我们的例子 (-rw-rw-r--)。假设这个文件(命名为 script.sh)实际是个shell脚本,需要被执行,但是你只想让自己有权限执行这个脚本。这个时候,你可能会想:“我需要是文件的权限如 -rwx-rw-r--”。为了设置 x 权限位,你可以这样使用 chmod 命令:

chmod u+x script.sh

这时候,列表中显示的应该是 -rwx-rw-r-- 。

如果你想同时让用户及其所属组同时拥有执行权限,命令应该这样:

chmod ug+x script.sh

明白这是怎么工作的了吗?下面我们让它更有趣些。不管什么原因,你不小心给了所有分组对文件的执行权限(列表中是这样的 -rwx-rwx-r-x)。

如果你想去除其他用户的执行权限,只需运行命令:

chmod o-x script.sh

如果你想完全删除文件的可执行权限,你可以用两种方法:

chmod ugo-x script.sh

或者

chmod a-x script.sh

以上就是所有内容,能使操作更有效率。我希望能避免哪些可能会导致一些问题的操作(例如你不小心对 script.sh 使用 a-rwx 这样的 chmod 命令)。

目录权限

你也可以对一个目录执行 chmod 命令。当你作为用户创建一个新的目录,通常新建目录具有这样的权限:

drwxrwxr-x

注:开头的 d 表示这是一个目录。

正如你所见,用户及其所在组都对文件夹具有操作权限,但这并不意味着在这文件夹中出创建的文件也具有与其相同的权限(创建的文件使用默认系统的权限 -rw-rw-r--)。但如果你想在新文件夹中创建文件,并且移除用户组的写权限,你不用切换到该目录下并对所有文件使用 chmod 命令。你可以用加上参数 R(意味着递归)的 chmod 命令,同时更改该文件夹及其目录下所有的文件的权限。

现在,假设有一文件夹 TEST,里面有一些脚本,所有这些(包括 TEST 文件夹)拥有权限 -rwxrwxr-x。如果你想移除用户组的写权限,你可以运行命令:

chmod -R g-w TEST

运行命令 ls -l,你讲看到列出的 TEST 文件夹的权限信息是 drwxr-xr-x。用户组被去除了写权限(其目录下的所有文件也如此)。

总结

现在,你应该对基本的 Linux 文件权限有了深入的理解。对于更高级的东西学起来会很轻松,像 setgid、setuid 和 ACL 这些。没有良好的基础,你很快就会混淆不清概念的。

Linux 文件权限从早期到现在没有太大变化,而且很可能以后也不会变化。


via: http://www.linux.com/learn/tutorials/885268-getting-to-know-linux-file-permissions

作者:Jack Wallen 译者:ynmlml 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出