有没有办法让特定用户创建的所有文件都属于安全FTP拥有特定组和文件权限?当然,相关用户将是该组的成员,但这不是他的主要组。换句话说,sftp 有没有办法自动复制 umask 和 newgrp 的效果?
答案1
有这样一种东西子系统在 (Open)SSH 中:这是一个在您请求除交互式 shell 之外的其他内容时启动的程序。从技术上讲,它只是远程主机上的可执行文件,在对您进行身份验证并调用 setuid 后exec
由sshd
子进程执行。
sftp
您可以在 SSH 配置中找到标准子系统定义:
Subsystem sftp /usr/lib/openssh/sftp-server
因为它只是一个简单的可执行文件,而不是 SUID 或任何其他特殊的可执行文件,所以您可以编写一个 shell 脚本来更改您需要的任何属性,然后只需启动原始子系统处理程序。
将以下脚本放入/usr/lib/openssh
文件夹中sftp-fperm-server
(这不是必需的,只是为了将东西放在一个地方):
#!/bin/sh
umask 026
exec /usr/lib/openssh/sftp-server
然后在末尾添加一行/etc/ssh/sshd_config
:
Subsystem sftp-fperm /usr/lib/openssh/sftp-fperm-server
然后重新启动sshd
(它不会在重新启动时终止会话)并sftp
使用-s sftp-fperm
选项启动。瞧!文件获得了新指定的 umask。
如果您不想每次都指定该选项,只需更改标准子系统定义即可。交互式会话不会受其影响,因此不会出现任何破坏的情况。
如果你想使用newgrp
命令,事情会有点棘手。newgrp
总是启动一个新的交互式 shell,但愚蠢的是不允许向其传递任何参数,因此你不能像umask
上例那样使用它。但你可以将脚本中的最后一行替换为:
SHELL=/usr/lib/openssh/sftp-server newgrp git
实际上,为我所属的某个组调用newgrp
会发出密码请求,所以我无法检查这个解决方案(我的意思是只有一个),但是当我在笔记本电脑上newgrp
传递时它可以工作(没有 SSH),所以如果你为用户工作,就不会出现任何问题。/bin/id
newgrp
答案2
除了 whitequark 所说的内容外,您还可以按照这些思路构建解决方案,但使用“sg”命令代替 newgrp,后者是群组的“su”。至少在任何 Linux 系统上都可以将其作为“man sg”进行查找。
答案3
chmod g+s directory
将授予用户组未来创建的所有目录和文件的所有权。
答案4
我认为这是特定于服务器的。检查服务器配置以获取可能的配置选项。