我正在尝试设置一个 scp 接收器,允许选定的用户基于 ssh 密钥以不同于他们自己的用户身份将文件 scp 到特定服务器。这是为了满足公司人物的访问限制。[8^) 最终设置将包括一个用户的 .ssh/config 文件,其中包含类似以下内容的条目:
Host ssh-server
HostName=my-ssh-server
User=receiver
他们的 scp 命令看起来很简单,如下所示:
scp /tmp/file.txt ssh-server:/some/dir/file.txt
我一直在关注有关为 scp、sftp 和 ssh 设置 umask 的一些问题,但我发现在创建目录时,umask 会被忽略,并且对于创建的目录和子目录的权限也是如此。但是文件权限是正确的。
以下是我所做的:
1:在接收方的~/.ssh/authorized_keys中添加以下内容:
command="/home/receiver/bin/bash_scp_run" ssh-rsa AAA ... My SSH Key
2:编写了上述脚本,将 umask 设置为 027,并将执行情况记录到 tmp 文件中。我还在没有此脚本的情况下进行了测试,结果并未显示已设置 umask 027。事实上,该系统上的默认 umask 似乎是 002。
#! /bin/bash
echo "Entering ~/bin/bash_scp_run" >> /tmp/scp_log.txt
umask 027
$SSH_ORIGINAL_COMMAND
3:运行了许多测试,包括:(假设本地所有文件和目录的权限为 777,因此 umask 应该是唯一的限制因素。)
3.1: scp /tmp/file.txt ssh-server:/some/dir/file.txt
结果:/some/dir/file.txt 的权限正如预期的那样为 750。
3.2: scp -r /tmp/dir-with-subdirs ssh-server:/some/dir/top-dir
结果:/some/dir/top-dir 的权限为 777,这是意料之外的。此外,/some/dir/top-dir/subdir 的权限为 777,这也是意料之外的!但是,任何级别的文件都具有 750 的权限,这是意料之中的。
在所有情况下,文件 /tmp/scp_log.txt 均显示 umask 已成功设置。
从 3.2 的结果来看,scp 创建目录时不遵守 umask,但创建文件时遵守 umask!根据我长期的 UNIX/Linux 经验,umask 不应该这样工作。这似乎是 scp 的一个错误。
答案1
我认为scp
您正在寻找的开关是“-p”。
从man scp
:
-p Preserves modification times, access times, and modes from the original file.
因此你的命令看起来应该是这样的:
scp -pr /tmp/dir-with-subdirs ssh-server:/some/dir/top-dir
我还认为您应该考虑使用rsync
而不是scp
因为它可以验证所传输文件的完整性并且它还具有“-p”开关,可以保留源位置文件的权限。
我通常使用:
rsync -avzp /src/dir /trg/dir
点击此链接可以获得关于每个开关的详细说明,而且这也是一个值得收藏的网站: https://www.explainshell.com/explain?cmd=rsync+-avzp+%2Ftmp%2Fsomedir+%2Fnew%2Flocation
编辑#1:
在这种情况下,我建议您将 umask 命令添加到远程端机器上的相关用户.bash_profile
(或任何其他 shell 启动脚本)中,因为据我所知, scp 在使用时也会运行用户的 rc 脚本。
您可以做的另一件事是使用 pam 模块,这将影响机器上的所有用户(除非以更复杂的方式配置)pam_umask.so
。
应配置的文件是:
/etc/pam.d/sshd
如果您想将此行为限制于 ssh 会话,您应该添加这样的行:
session optional pam_umask.so umask=0007