我正在使用以下命令更改用户和组的所有权:
sudo chown -R apache:www /var/www
然而,我注意到,每当我向该目录添加新文件或文件夹时,所有者都是我当前的用户名,而不是预期的用户apache。如何修改上面的命令,使将来所有的文件夹和文件都归apache:www所有?或者我需要使用一个额外的命令?
30byixjq1#
您可以使用ACL来执行此操作。例如:
$ ls -ld /var/www drwxr-xr-x 2 apache www 4096 Aug 7 13:53 /var/www $ sudo setfacl -dRm u:apache:rwX,g:www:rwX /var/www $ ls -ld /var/www drwxr-xr-x+ 2 apache www 4096 Aug 7 13:53 /var/www $ getfacl /var/www # file: var/www # owner: apache # group: www user::rwx group::r-x other::r-x default:user::rwx default:user:apache:rwx default:group::r-x default:group:www:rwx default:mask::rwx default:other::r-x
当新文件被创建时,它们仍然由您的用户拥有,但也会有一个ACL设置,授予apache用户权限:
$ touch donkey $ ls -l donkey -rw-rw-r--+ 1 gene gene 0 Aug 7 13:57 donkey $ getfacl donkey # file: donkey # owner: gene # group: gene user::rw- user:apache:rwx #effective:rw- group::rwx #effective:rw- group:www:rwx #effective:rw- mask::rw- other::r--
命令概述:
setfacl -dRm u:apache:rwX,g:www:rwX /var/www
-d
-R
-m
之后就很简单了
这些条目必须用逗号分隔。X权限(注意:它是大写的)意味着它将只应用于目录而不是文件。
X
uubf1zoe2#
您可以通过使用chmod的SETGID(SET Group ID)标志在组级别上实现这一点:
chmod
SETGID
chmod g+s <directory>
关于docs:在大多数系统上,如果设置了目录的set-group-ID位,则新创建的子文件继承与目录相同的组,并且新创建的子目录继承父目录的set-group-ID位。一旦你设置好了,在<directory>中新建的文件和目录将被设置为<group>。例如
<directory>
<group>
chmod g+s /srv/www
将导致/srv/www中新创建的文件和目录具有组www。您可以通过执行ls -al来验证这一点,这将显示s对目录的组“执行”权限。例如
/srv/www
www
ls -al
s
drwxr-sr-x. 5 apache www 4096 Mar 13 20:32 www ^ SETGID
yrefmtwq3#
我猜你需要在执行命令之前更改用户-一个类似这样的脚本:
$whoami user1 $ su - apache Password: $ whoami apache [add file] $ exit
eaf3rand4#
类POSIX文件系统中的新文件总是有一个拥有用户和一个拥有组。chown(2) man page中详细解释了如何确定所有者,但所有者将 * 始终 * 是运行创建文件的任何进程的用户帐户,尽管您可以通过调整SETGID或ACL来拥有与进程组不同的组。如果你想创建一个拥有不同所有者的新文件,你需要确保创建文件的进程拥有你想要的用户。因此,如果您当前正在运行<command>,并且希望文件开始时由apache拥有,则可能需要运行sudo -u apache <command>,以便进程以apache用户身份运行。如果您无论如何都要这样做,那么可能更容易不去担心SETGID或类似的东西,而只是确保在拥有过程中也有正确的组来设置组。这意味着你需要运行sudo -u apache -g www <command>。显然,您可以继续使用chown,这可能是最简单的选择。您还可以通过确保组权限(通过SETGID或ACL(或更深奥的选项))使问题变得无关紧要,这意味着所有者不相关。但是如果你想让所有者从一开始就是一个不同的用户,那么sudo(或者其他可以让你改变运行给定进程的帐户的东西,例如su)是实现这一点的唯一方法。
<command>
apache
sudo -u apache <command>
sudo -u apache -g www <command>
chown
sudo
su
4条答案
按热度按时间30byixjq1#
您可以使用ACL来执行此操作。例如:
当新文件被创建时,它们仍然由您的用户拥有,但也会有一个ACL设置,授予apache用户权限:
命令概述:
-d
标志指定应用于默认ACL的操作。-R
标志设置要递归应用的操作-m
表示这将是一个修改操作之后就很简单了
这些条目必须用逗号分隔。
X
权限(注意:它是大写的)意味着它将只应用于目录而不是文件。uubf1zoe2#
您可以通过使用
chmod
的SETGID
(SET Group ID)标志在组级别上实现这一点:关于docs:
在大多数系统上,如果设置了目录的set-group-ID位,则新创建的子文件继承与目录相同的组,并且新创建的子目录继承父目录的set-group-ID位。
一旦你设置好了,在
<directory>
中新建的文件和目录将被设置为<group>
。例如将导致
/srv/www
中新创建的文件和目录具有组www
。您可以通过执行
ls -al
来验证这一点,这将显示s
对目录的组“执行”权限。例如yrefmtwq3#
我猜你需要在执行命令之前更改用户-一个类似这样的脚本:
eaf3rand4#
类POSIX文件系统中的新文件总是有一个拥有用户和一个拥有组。chown(2) man page中详细解释了如何确定所有者,但所有者将 * 始终 * 是运行创建文件的任何进程的用户帐户,尽管您可以通过调整SETGID或ACL来拥有与进程组不同的组。
如果你想创建一个拥有不同所有者的新文件,你需要确保创建文件的进程拥有你想要的用户。因此,如果您当前正在运行
<command>
,并且希望文件开始时由apache
拥有,则可能需要运行sudo -u apache <command>
,以便进程以apache
用户身份运行。如果您无论如何都要这样做,那么可能更容易不去担心SETGID或类似的东西,而只是确保在拥有过程中也有正确的组来设置组。这意味着你需要运行
sudo -u apache -g www <command>
。显然,您可以继续使用
chown
,这可能是最简单的选择。您还可以通过确保组权限(通过SETGID或ACL(或更深奥的选项))使问题变得无关紧要,这意味着所有者不相关。但是如果你想让所有者从一开始就是一个不同的用户,那么sudo
(或者其他可以让你改变运行给定进程的帐户的东西,例如su
)是实现这一点的唯一方法。