使用 sftp 的文件权限和组所有权

use*_*844 7 file-management user-accounts sftp permissions

有没有办法让特定用户在sftp下创建的所有文件都具有特定的组和文件权限?当然,有问题的用户将是该组的成员,但不是他的主要组。也就是说sftp有没有办法自动复制umask和newgrp的效果?

whi*_*ark 5

(Open)SSH 中有一个子系统这样的东西:它是一个程序,当您请求交互式 shell 之外的其他内容时,它就会启动。从技术上讲,它只是远程主机上的一个可执行文件,在对您进行身份验证并调用 setuid 后execsshd子进程执行。

您可以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工作对于用户来说应该不会出现问题。


pca*_*mic 0

我假设这是特定于服务器的。检查服务器配置以获取潜在的配置选项。