scp:错误:意外的文件名:

scp:错误:意外的文件名:

我长期使用的 SCP 上传文件突然停止工作。12 小时前我运行了该脚本,它运行正常,但突然停止了。

有问题的命令是将当前目录上传到远程文件夹:

#!/bin/bash
cd "$(dirname "$0")"

scp -r . <remote_server>:<remote_folder>

错误信息是:

scp: error: unexpected filename: .

我在运行 Mojave 10.14.2 的 Mac 上。

更新:我已经通过将命令重写为此来解决了具体问题,但我仍然想知道是什么出了问题:

scp -r $(pwd) <remote_server>:<remote_folder>

答案1

罪魁祸首是CVE-2018-20685,其描述为:

在 OpenSSH 7.9 中,scp 客户端中的 scp.c 允许远程 SSH 服务器通过 . 或空文件名绕过有意的访问限制。其影响是在客户端修改目标目录的权限。

这是一个SCP 漏洞的集合更大. 引用自那里:

概述

来自多个供应商的 SCP 客户端容易受到恶意 scp 服务器的攻击,该服务器会对目标目录执行未经授权的更改和/或客户端输出操作。

描述

许多 scp 客户端无法验证 scp 服务器返回的对象是否与其要求的对象匹配。这个问题可以追溯到 1983 年的 rcp,scp 就是基于此而产生的。客户端中还有一个漏洞,允许任意更改目标目录属性。最后,客户端中的两个漏洞可能允许服务器伪造客户端输出。

犯罪2018 年 11 月 16 日发布了修复 OpenBSD 漏洞的补丁

答案2

@BlackBear 的另一个答案解释道为什么这不再起作用。

但是如果你和我一样,也想找到这个问题的解决方案,那么似乎正确的方法是使用rsync而不是scp。例如,我的一个旧scp命令应该是这样的:

# this no longer works due to the "."
scp -BCr output/html/. www:/var/www/site/html/

现在我用的是这个:

rsync --recursive --times --compress --delete --progress output/html/ www:/var/www/site/html/

如果您喜欢较短的旗帜,它看起来应该像这样:

rsync -rtz --del --progress output/html/ www:/var/www/site/html/

/源的尾部很重要。它告诉 rsync 你想要内容该目录没有目录名。

在把事情搞砸之前也要考虑--dry-run一下。man rsync

相关内容