我使用了很长时间来上传文件的 SCP 突然停止工作。我在 12 小时前运行了脚本,它运行得很好,但突然停止了。
有问题的命令是将当前目录上传到远程文件夹:
#!/bin/bash
cd "$(dirname "$0")"
scp -r . <remote_server>:<remote_folder>
Run Code Online (Sandbox Code Playgroud)
错误信息是:
scp: error: unexpected filename: .
Run Code Online (Sandbox Code Playgroud)
我在运行 Mojave 10.14.2 的 Mac 上。
更新:我已经通过将命令重写为此解决了特定问题,但我仍然有兴趣知道发生了什么:
scp -r $(pwd) <remote_server>:<remote_folder>
Run Code Online (Sandbox Code Playgroud)
Bla*_*ear 22
罪魁祸首是CVE-2018-20685,其描述为:
在 OpenSSH 7.9 中,scp 客户端中的 scp.c 允许远程 SSH 服务器通过 . 或空文件名。影响是在客户端修改目标目录的权限。
这是更大的一组 SCP 漏洞的一部分。从那里引用:
概述
来自多个供应商的 SCP 客户端容易受到恶意 scp 服务器对目标目录和/或客户端输出操作执行未经授权的更改的影响。
描述
许多 scp 客户端无法验证 scp 服务器返回的对象是否与其请求的对象匹配。这个问题可以追溯到 1983 年和 scp 所基于的 rcp。客户端中的一个单独缺陷允许任意更改目标目录属性。最后,客户端中的两个漏洞可能允许服务器欺骗客户端输出。
在 OpenBSD 中修补此漏洞的提交是在 2018 年 11 月 16 日进行的
Sté*_*ane 12
@BlackBear 的另一个答案解释了为什么这不再有效。
但是,如果像我一样,您最终也在这个问题上寻找解决方案,那么正确的方法似乎是使用rsync而不是scp. 例如,我的一个旧scp命令看起来像这样:
# this no longer works due to the "."
scp -BCr output/html/. www:/var/www/site/html/
Run Code Online (Sandbox Code Playgroud)
现在我用这个:
rsync --recursive --times --compress --delete --progress output/html/ www:/var/www/site/html/
Run Code Online (Sandbox Code Playgroud)
如果你喜欢较短的标志,它看起来像这样:
rsync -rtz --del --progress output/html/ www:/var/www/site/html/
Run Code Online (Sandbox Code Playgroud)
/源头的尾随很重要。它告诉 rsync 您想要没有目录名称的目录的内容。
也可以考虑--dry-run与man rsync搞乱事情之前。
| 归档时间: |
|
| 查看次数: |
17546 次 |
| 最近记录: |