我长期使用的 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