我一直在寻找一种方式来设置的OpenSSH的的umask以0027
在所有连接类型一致的方式。
通过连接类型,我指的是:
3. 和 4. 之间的区别在于前者启动一个通常读取/etc/profile
信息的外壳,而后者不启动。
此外,通过阅读这篇文章,我了解到较新版本的 OpenSSH 中存在 -u 选项。然而这行不通。
我还必须补充一点,/etc/profile
现在包括umask 0027
.
逐点进行:
-u 0027
在这里sshd_config
提到的设置,是不够的。如果我不设置这个参数,sftp 默认使用umask 0022
. 这意味着如果我有两个文件:
-rwxrwxrwx 1 user user 0 2011-01-29 02:04 execute
-rw-rw-rw- 1 user user 0 2011-01-29 02:04 read-write
Run Code Online (Sandbox Code Playgroud)
当我使用 sftp 将它们放入目标机器时,我实际上得到:
-rwxr-xr-x 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write
Run Code Online (Sandbox Code Playgroud)
但是,当我-u 0027
打开sshd_config
目标机器时,我实际上得到了:
-rwxr--r-- 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write
Run Code Online (Sandbox Code Playgroud)
这不是预期的,因为它实际上应该是:
-rwxr-x--- 1 user user 0 2011-01-29 02:04 execute
-rw-r----- 1 user user 0 2011-01-29 02:04 read-write
Run Code Online (Sandbox Code Playgroud)
任何人都明白为什么会发生这种情况?
scp - 与sftp 的设置无关,权限总是umask 0022
. 我目前不知道如何改变这一点。
ssh主机名 - 这里没问题,因为 shell/etc/profile
默认读取,这意味着umask 0027
在当前设置中。
ssh主机名程序- 与scp相同的情况。
总而言之,设置 umasksftp
会改变结果,但不是它应该的那样,ssh hostname
按预期阅读/etc/profile
并且两者都工作,scp
并且ssh hostname program
似乎在umask 0022
某处进行了硬编码。
欢迎对上述任何一点有任何见解。
编辑:我想避免需要手动编译 openssh 的补丁。该系统正在运行 Ubuntu Server 10.04.01 (lucid) LTS,其中openssh
包含来自 Maverick 的软件包。
答:正如 poige 所指出的,使用 pam_umask 可以解决问题。
确切的变化是:
添加的行/etc/pam.d/sshd
:
# Setting UMASK for all ssh based connections (ssh, sftp, scp)
session optional pam_umask.so umask=0027
Run Code Online (Sandbox Code Playgroud)
此外,为了影响所有登录 shell,无论它们是否来源/etc/profile
,同样的行也被添加到/etc/pam.d/login
.
编辑:在发表了一些评论之后,我重新测试了这个问题。
至少在 Ubuntu(我测试过的地方)中,如果用户在其 shell 的 init 文件(.bashrc、.zshrc 等)中设置了不同的 umask,则 PAM umask 将被忽略,而是使用用户定义的 umask。/etc/profile
除非用户在 init 文件中明确获取这些更改,否则更改不会影响结果。
目前尚不清楚这种行为是否在所有发行版中都会发生。
lar*_*sks 15
这是一个解决方案,可让您在每个用户的基础上做您想做的事情。它仅使用本机sshd
功能,不需要使用本地维护的补丁。此解决方案利用ForceCommand
sshd的行为将环境设置脚本插入每个 ssh 连接,然后运行原始命令。
首先,在系统上的某处创建一个包含以下内容的脚本:
#!/bin/sh
umask 0027
exec /bin/sh -c "${SSH_ORIGINAL_COMMAND:-$SHELL}"
Run Code Online (Sandbox Code Playgroud)
出于本示例的目的,我假设您已经调用了 this /usr/bin/umask-wrapper
。
现在,您有几个选项可以进行设置。如果您希望这是所有用户的强制性配置(这似乎不太可能),您可以修改您的 sshd 配置以包含以下内容:
ForceCommand /usr/bin/umask-wrapper
Run Code Online (Sandbox Code Playgroud)
如果您只想将此应用于某些用户,您可以使用一个Match
块(这在您的 末尾sshd_config
):
Match User user1,user2
ForceCommand /usr/bin/umask-wrapper
Run Code Online (Sandbox Code Playgroud)
如果您希望这是用户可控制的行为,那么您可以使用文件中的command=
选项authorized_key
为特定键选择此行为。例如,在测试时,我在authorized_keys
文件中添加了一个条目,如下所示:
command="/home/lars/bin/umask-wrapper" ssh-rsa AAAAB3NzaC1 ... umask-test
Run Code Online (Sandbox Code Playgroud)
以下是我的一些测试结果:
ssh
不带命令使用:
localhost$ ssh remotehost
remotehost$ touch umask-test/file1
remotehost$ ls -l umask-test/file1
-rw-r-----. 1 lars lars 0 Feb 2 06:02 file1
Run Code Online (Sandbox Code Playgroud)
使用ssh
的命令:
localhost$ ssh remotehost touch umask-test/file2
localhost$ ssh remotehost ls -l umask-test/file2
-rw-r-----. 1 lars lars 0 Feb 2 06:03 file2
Run Code Online (Sandbox Code Playgroud)
使用scp
:
localhost$ touch file3
localhost$ ls -l file3
-rw-r--r-- 1 lars staff 0 Feb 2 06:03 file3
localhost$ scp file3 remotehost:umask-test/file3
localhost$ ssh remotehost ls -l umask-test/file3
-rw-r-----. 1 lars lars 0 Feb 2 06:03 file3
Run Code Online (Sandbox Code Playgroud)
使用sftp
:
localhost$ sftp remotehost
sftp> put file3 umask-test/file4
sftp> ls -l umask-test/file4
-rw-r----- 0 500 500 0 Feb 2 06:05 umask-test/file4
Run Code Online (Sandbox Code Playgroud)
你有它。我相信这是您正在寻找的行为。如果您对此解决方案有任何疑问,我很乐意提供更多详细信息。
我采取了稍微不同的方法来集中设置。
这被添加到/etc/pam.d/common-session
:
session optional pam_umask.so
Run Code Online (Sandbox Code Playgroud)
这是在/etc/login.defs
:
UMASK 0027
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
60042 次 |
最近记录: |