我知道这个问题已经被讨论过了,但是通过阅读帖子我无法找到答案,因为有些人说“是的,umask 可以工作”,而其他人说“OpenSSH put 命令始终保留权限”
首先要明确一点:
- 我在 RHEL 6.2 上使用 OpenSSH 5.9
- 我已经使用子系统配置了一个 chrooted SFTP 服务器,
internal-sftp
并-u 0002
使用 umask - 我明确表示我不使用
-p
或-P
选项
就我所读到的一方面来说:有很多种方法可以为 SFTP 传输定义 umask:
- (或)选项,自 OpenSSH 5.4
-u
起internal-sftp
sftp-server
- 创建一个包装器
sftp-server
(我们在其中明确设置了 umask - 顺便说一下,这不适合 chrooted 环境) pam.d/sshd
在文件中添加特定配置
另一方面,我读过:
OpenSSH SFTP 客户端和服务器会传输权限(作为扩展)并在本地使用权限创建远程文件。据我所知,没有办法禁用此行为。
因此我做了以下测试:
在我的客户端上,我创建了具有权限 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,我可以想象我在测试配置中做错了什么。
我将非常感激一些经验丰富的反馈。
谢谢。
答案1
首先,umask 是关于服务器的,而不是客户端的。因此询问put
OpenSSH 客户端的命令是否使用 umask 是错误的。您应该询问 OpenSSH 服务器在通过 SFTP 上传创建文件时是否使用 umask。
无论如何,OpenSSH SFTP 客户端的作用是:
put
如果没有-P
标志,它会要求服务器创建一个与本地文件具有相同权限的文件。然后 OpenSSH 服务器(根据 *nix 规则隐式)应用 umask。put
使用该-P
标志时,启动过程相同,但在上传完成后,客户端要求服务器明确(重新)将权限设置为与本地文件相同的权限(“chmod”请求)。对于“chmod”,umask 不适用。mkdir
,它要求服务器创建一个权限为 0777 的目录。umask 隐式应用。
无论如何,我相信 umask 0002 对权限为 0600 的文件没有影响,因为它们是互斥的。您应该针对权限为 0644 的文件尝试 umask。
因此,实际上,如果您的系统配置如您所述,它应该可以工作。请参阅我的盒子中的证据(Ubuntu 带有 OpenSSH 6.2p2)
Match user user2
ChrootDirectory /home/user2/chroot
ForceCommand internal-sftp -u 0077
AllowTcpForwarding no
PermitTunnel no
X11Forwarding no
put
查看与之后的权限差异put -P
:
user1:~$ touch file.txt
user1:~$ ls -l
total 0
-rw-r--r-- 1 user1 ftpuser 0 Oct 23 15:34 file.txt
user1:~$ sftp user2@localhost
user2@localhost's password:
Connected to localhost.
sftp> cd somefolder
sftp> put file.txt
Uploading file.txt to /somefolder/file.txt
file.txt 100% 0 0.0KB/s 0:00
sftp> ls -l
-rw------- 1 1003 1001 0 Oct 23 15:35 file.txt
sftp> put -P file.txt
Uploading file.txt to /somefolder/file.txt
file.txt 100% 0 0.0KB/s 0:00
sftp> ls -l
-rw-r--r-- 1 1003 1001 0 Oct 23 15:34 file.txt
顺便提一句,最新的 SFTP 规范定义客户端和服务器关于 umask 的行为。如您所见,OpenSSH 实际上违反了该规则,尽管 OpenSSH 实现了尚未提及 umask 的 SFTP 版本 3。
7.6. 权限
...
服务器不应将“umask”应用于模式位;但应按客户端指定的方式设置模式位。客户端必须在发送模式位之前将适当的“umask”应用于模式位。