我希望我的 apache 用户能够读取和写入文件,我的 sftp 用户能够上传文件,然后其他 sftp 用户和 apache 都可以使用(rwX),并且其他所有人都可以读取。
嘘:I know this question comes up a lot, and I've been reading answers and trying many many things for two days now and am now thoroughly confused
。还有我知道允许 www-data 写访问我的网站会带来安全风险,但这不是我在这里要讨论的问题。
这是我的步骤:
usermod -aG www-data tim
mkdir -p /var/www/mysite/public_html
# now upload/untar the site, etc. not shown here #
chown -R www-data:www-data /var/www/mysite
chmod -R u+rwX,go+rwX,g+s,o-w /var/www/mysite
# now make the apache virtual host and so on .. not shown here #
里面的文件public_html
设置如下-组有写入权限:
-rw-rwSr-- 1 www-data www-data favicon.ico
现在,使用 sftp 以我的“tim”帐户登录,我将一个新文件上传到 public_html 文件夹,然后查看其权限:
-rw-r--r-- 1 tim wwww-data COPYING.txt
所以我丢失的组写入,即使我认为我已经g+s
在父文件夹中添加了它,以便它可以继承该组。
显然,这并不意味着它还继承了组 /mask/。我曾在某处读到(但已丢失引用)SFTP 不遵守 umask;这似乎是权限丢失的地方,但我不知道如何修复它。
编辑 找到了 umask 参考并尝试过 -http://john.parnefjord.se/node/62- 可以看到文件在登录时正在执行,但是上传后掩码仍未设置为 g+w。
答案1
我没有进行太多检查,但我在本地服务器上使用不同的组权限尝试了 2-3 次。
我在这里得到的是,在本地系统上授予文件的任何权限都是完全相同的权限通过远程服务器的文件获取。
答案2
当进程在 unix 上创建文件时,该进程控制为文件分配哪些权限。进程在文件创建系统调用中指定一组权限,通常为 0666 或 0777。权限由进程的 umask 修改,以产生文件的实际权限。父目录上的特殊标志不属于此过程。进程还可以通过另一个名为 的系统调用更改现有文件的权限chmod()
。
SFTP 实际上是一种远程文件系统协议。当客户端在服务器上创建文件时,客户端可以告诉服务器应该为新文件授予哪些权限。客户端还可以chmod()
远程调用以更改现有文件的权限。据我所知,OpenSSH SFTP 服务器不提供任何方法让服务器管理员限制此操作。
我可能会编写一个 shell 脚本来扫描文件夹并修复文件权限。您可以每隔cron
几分钟运行一次该脚本。以下内容应该可以帮助您入门:
#!/bin/sh
cd /var/www/mysite || exit 1
find . -type f ! -perm 0664 -exec chmod 0664 '{}' ';'