use*_*844 7 file-management user-accounts sftp permissions
有没有办法让特定用户在sftp下创建的所有文件都具有特定的组和文件权限?当然,有问题的用户将是该组的成员,但不是他的主要组。也就是说sftp有没有办法自动复制umask和newgrp的效果?
(Open)SSH 中有一个子系统这样的东西:它是一个程序,当您请求交互式 shell 之外的其他内容时,它就会启动。从技术上讲,它只是远程主机上的一个可执行文件,在对您进行身份验证并调用 setuid 后exec
由sshd
子进程执行。
您可以sftp
在 SSH 配置中找到标准子系统定义:
Subsystem sftp /usr/lib/openssh/sftp-server
Run Code Online (Sandbox Code Playgroud)
由于它只是一个普通的可执行文件,而不是 SUID 或任何其他特殊的,您可以编写一个 shell 脚本来更改您需要的任何属性,然后只需启动原始子系统处理程序。
将以下脚本放入/usr/lib/openssh
文件夹中,例如sftp-fperm-server
(这不是必需的,只是为了将内容放在一个地方):
#!/bin/sh
umask 026
exec /usr/lib/openssh/sftp-server
Run Code Online (Sandbox Code Playgroud)
然后在末尾添加一行/etc/ssh/sshd_config
:
Subsystem sftp-fperm /usr/lib/openssh/sftp-fperm-server
Run Code Online (Sandbox Code Playgroud)
然后重新启动sshd
(它不会在重新启动时终止会话)并sftp
使用一个-s sftp-fperm
选项启动。瞧!文件获取新的指定 umask。
如果您不想每次都指定该选项,只需更改标准子系统定义即可。交互式会话不会受到它的影响,因此没有机会破坏某些东西。
如果你想使用newgrp
命令,事情会有点棘手。newgrp
总是启动一个新的交互式 shell,而愚蠢地不允许向它传递任何参数,因此您不能像umask
前面的示例那样使用它。但是您可以将脚本中的最后一行替换为:
SHELL=/usr/lib/openssh/sftp-server newgrp git
Run Code Online (Sandbox Code Playgroud)
实际上调用newgrp
我所属的某个组会发出密码请求,所以我无法检查这个解决方案(我的意思是只有newgrp
一个),但是当我通过/bin/id
我的笔记本电脑(没有 SSH)时它可以工作,所以如果你开始newgrp
工作对于用户来说应该不会出现问题。