我创建了一个 Web 服务器,有两个用户可以通过 SFTP 登录来更改、编辑、查看和创建文件夹/新文件。当这两个用户创建新文件时,权限为 -rw-r--r--。我需要权限来允许另一个用户写入,但他们现在无法做到。我尝试更改 umask、sshd-config 文件、组权限等,但我仍然不知道如何修复此问题。任何帮助都将不胜感激。谢谢!
Web 服务器在 Raspberry Pi 上运行 Raspbian。我安装了 Apache、PHP、MySQL 和 PHPmyAdmin。我通过 Mac 上的 filezilla 通过 SFTP 连接到 pi。
答案1
我为你做了一些研究。
我的(本地)客户端是 Ubuntu,我的(远程)服务器是 Raspbian。我使用客户端的交互式命令通过 SFTP 连接sftp
。我使用以下命令将具有本地权限的测试文件-rwxrwxrwx
从客户端传输到服务器sftp
:
put testfile
远程副本继承了权限,但其中一些权限被远程 umask 屏蔽,即0022
,因此远程权限变为-rwxr-xr-x
。这是预期的。
然后我编辑了远程~/.profile
以(临时)将 umask 设置为0002
。再次登录后,新的 umask 在远程 shell 中起作用。我重新启动了本地sftp
并再次测试,但新的远程副本没有遵循新的 umask。
这并不奇怪。我的遥控器上.profile
显示:
要设置 ssh 登录的 umask,请安装并配置 libpam-umask 包
原来libpam-umask
实际上是在libpam-modules
。它已经安装好了。
我读这份文件. 给出了一个例子:
添加以下行以
/etc/pam.d/login
在登录时设置用户特定的 umask:session optional pam_umask.so umask=0022
我检查了远程/etc/pam.d
目录,猜测我需要sshd
在那里修改文件,而不是login
。另外,我不想将 umask 全局传递给模块。文档说:
PAM 模块尝试按以下顺序从以下位置获取 umask 值:
umask=
争论umask=
用户的 GECOS 字段中的条目- […]
我选择了地理经济合作组织,运行sudo vipw
并添加umask=0002
到我的条目;保存。结果是:
kamil:x:1001:1004:Kamil Maciorowski,,,,umask=0002:/home/kamil:/bin/bash
然后我在末尾添加了这一行/etc/pam.d/sshd
:
session optional pam_umask.so
此后,我删除了 的远程副本testfile
,重新运行本地sftp
并再次传输testfile
。新的远程副本遵循我选择的 umask。
编辑
我在本地 Ubuntu 上尝试了 FileZilla。它根据远程 umask 在服务器上创建文件;它复制本地文件及其本地权限,同时根据远程 umask。
使用 FileZilla,可以“手动”更改远程文件的权限。我明白这是您想要避免的。
(编辑到此结束)
我认为您的流程如下:
- 以上述示例为例,为相关的两个用户设置 umask,以便他们通过 SFTP 创建的远程文件可以由组写入。
- 在服务器上创建一个特殊组,将两个用户添加到其中并使其成为他们的主要组。
(我不会在这里详细解释第 2 点。请进行研究;遇到问题时请单独提出问题)。
这样,两个用户中的任何一个通过 SFTP 创建的每个新文件都将属于特殊组,并且可由该组写入。请记住,复制的文件会尽可能保留其权限(至少在我的测试中是这样)。
答案2
我认为 filezilla 除了使用远程服务器上指定的默认权限创建文件之外没有做任何其他事情。
如果您可以更改为使用 OpenSSH SFTP 客户端和服务器,则可以使用put
该-P
标志。
这样会创建文件,该文件始终会获得远程服务器的正常权限。但在上传完成后,客户端会进一步通过请求要求服务器明确(重新)设置权限,使其与本地文件相同chmod
,而 umask 对此不适用。
有关详细信息,请参阅这个答案。