创建目录时,如何让 scp -r 遵守服务器端的 umask?

创建目录时,如何让 scp -r 遵守服务器端的 umask?

我正在尝试设置一个 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

相关内容