在sftp中,如何设置文件夹中所有文件的默认权限?

use*_*435 5 sftp file-permissions

我想将文件夹中所有文件(包括新上传的文件)的默认权限设置为某个值,例如 644,而不是一直执行“chmod 644”。

是否有任何命令使这成为可能?

小智 7

或者,您可以在 sshd 的配置文件(我的 Debian 机器上的 /etc/ssh/sshd_config)中为所有 sftp 登录设置 umask。为此添加-u 022到 sftp 子系统行,如下所示:

Subsystem sftp /usr/lib/openssh/sftp-server -u 022
Run Code Online (Sandbox Code Playgroud)

来自man sftp-server

-u umask
     Sets an explicit umask(2) to be applied to newly-created files and directo?
     ries, instead of the user's default mask.
Run Code Online (Sandbox Code Playgroud)


anl*_*lag 7

我花了大量时间寻找这个问题的更完整答案。为 sftp 配置不同的 umask 很好,但这不是一个通用的答案,因为 umask 只会限制权限而不授予额外的权限。通过 sftp 上传的文件最终获得的确切权限还取决于原始源文件的权限以及用于上传的客户端。

例如,我已将我的(OpenSSH,在 Red Hat 服务器上)sftp 服务器上的 umask 设置为 0002,但是如果我使用 OpenSSH sftp 客户端在源系统上上传具有 0600 权限的文本文件,它仍然具有0600 目标权限。值得注意的是,这意味着据我所知,我无法确保上传到此 sftp 服务器的文件具有任何组权限,这意味着我也无法使用访问控制列表 (ACL) 将权限扩展到其他用户或组.

尝试两种解决此问题的方法,尽管在这两种情况下,它们都是解决方法而不是解决方案:

  • 创建一个 cron 作业以在事后手动设置所需的权限。足够简单但异步,即使您可以经常运行它。
  • 使用inotify监视 sftp 服务器使用的目标目录,并为在其中创建的任何文件设置所需的权限。这实际上应该是即时的,但可能有其他限制,例如在大量文件或目录的情况下。

在 positon.org 上看到了一篇博客文章,它很好地解释了 inotify 选项,包括示例甚至初始化脚本。最好在那里阅读,但如果该网站消失,关键命令是:

inotifywait -mrq -e CREATE --format %w%f /tmp/mytest/ | while IFS= read -r FILE; do chmod g=u "$FILE"; done
Run Code Online (Sandbox Code Playgroud)

尽管如此简洁,但我仍然对一种通过功能或技巧在 sftp 或至少在 shell 中获得相同结果而不涉及单独实用程序的方式非常感兴趣。


小智 5

修改 /etc/ssh/sshd_config 为:

Subsystem sftp internal-sftp -m 0644
Run Code Online (Sandbox Code Playgroud)

重新加载 SSHD 配置:

sudo systemctl reload sshd
Run Code Online (Sandbox Code Playgroud)


小智 0

权限文件的创建取决于您的umask. 要获得 644 权限,请将 umask 设置为 022 ( umask 022)。

要使此更改永久生效,请将该命令放入远程服务器中~/.profile(取决于您的 shell)。