我知道这个问题已经讨论过了,但是通过阅读帖子我无法找到答案,因为有人说“是的 umask 可以工作”,而其他人说“OpenSSH put 命令总是保留权限”
首先要准确地说:
- 我在 RHEL 6.2 上使用 OpenSSH 5.9
- 我已经配置了一个 chrooted SFTP 服务器,使用
internal-sftp
子系统,-u 0002
用于 umask - 我精确我不使用
-p
or-P
选项
从我一方面阅读的内容来看:有很多方法可以为 SFTP 传输定义 umask:
- (or ) 的选项
-u
,从 OpenSSH 5.4 开始internal-sftp
sftp-server
- 创建一个包装器
sftp-server
(我们在其中明确设置了 umask - 这不适合 chrooted 环境顺便说一句) pam.d/sshd
在文件中添加特定配置
另一方面,我读过:
OpenSSH SFTP 客户端和服务器确实传输权限(作为扩展)并在本地创建具有权限的远程文件。AFAICT,没有办法禁用此行为。
所以我做了以下测试:
在我的客户端上,我创建了权限为 600 和 700 的文件MYFILE
和目录。MYDIR
然后使用sftp
命令:
mkdir => the new directory has permissions following the umask (OK)
put MYFILE => MYFILE has same permissions as on client (KO)
put -r MYDIR => MYDIR has same permissions as on client (KO)
如果我在客户端更改和的权限MYFILE
,MYDIR
然后再次上传,我会在服务器端获得新的权限。
我也尝试了pam.d
解决方案,但没有任何改变。
所以现在我很困惑:
根据我的测试和阅读的部分内容,我会说 OpenSSH 始终保留权限。但是由于有很多帖子说可以定义 umask,我可以想象我在测试配置中做错了事。
我会很感激一些有经验的反馈。
谢谢你。
首先,umask 是关于服务器而不是客户端的。所以询问
put
OpenSSH 客户端的命令是否使用 umask 是错误的。由于 SFTP 上传而创建文件时,您应该询问 OpenSSH 服务器是否使用 umask。无论如何,OpenSSH SFTP 客户端的作用是:
put
没有-P
标志,它要求服务器创建一个与本地文件具有相同权限的文件。然后 OpenSSH 服务器(通过 *nix 规则隐式)应用 umask。put
使用该-P
标志,它以相同的方式启动,但在上传完成后,客户端要求服务器明确(重新)将权限设置为与本地文件具有相同的权限(“chmod”请求)。对于“chmod”,umask 不适用。mkdir
,它要求服务器创建一个权限为 0777 的目录。umask 隐式应用。无论如何,我相信 umask 0002 对权限为 0600 的文件没有影响,因为它们是互斥的。您应该针对具有 0644 等权限的文件尝试使用 umask。
所以实际上,如果您按照描述的方式配置系统,它应该可以工作。从我的盒子中查看证据(带有 OpenSSH 6.2p2 的 Ubuntu)
put
查看vs.之后的权限差异put -P
:顺便说一句,最新的 SFTP 规范定义了客户端和服务器关于 umask 的行为。如您所见,OpenSSH 实际上违反了这一点,尽管 OpenSSH 实现了 SFTP 版本 3,但尚未提及 umask。