我有一个脚本,该脚本使用SCP从AWS上的远程Linux主机提取文件。在每晚运行相同代码约6个月而没有问题后,它今天开始以protocol error: filename does not match request
失败。我在以下一些更简单的文件名上重现了该问题:
$ scp -i $IDENT $HOST_AND_DIR/"foobar" .
# the file is copied successfully
$ scp -i $IDENT $HOST_AND_DIR/"'foobar'" .
protocol error: filename does not match request
# used to work, i swear...
$ scp -i $IDENT $HOST_AND_DIR/"'foobarbaz'" .
scp: /home/user_redacted/foobarbaz: No such file or directory
# less surprising...
我用单引号引起来的原因是我抓取的文件最初带有空格。为了处理空格,我已经做了$HOST_AND_DIR/"'foo bar'"
了很多月,但是从今天开始,它只会接受$HOST_AND_DIR/"foo\ bar"
。因此,我的问题 已修复,但是我仍然对正在发生的事情感到好奇。
我搜索了错误消息,但没有看到任何真正的提及,这使我感到惊讶。
参与的两个主机在OpenSSL 1.0.2g
的输出中都有ssh -v localhost
,并且bash --version
说GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
有什么想法吗?
答案 0 :(得分:17)
我最终查看了源代码,并发现了抛出此错误的提交:
远程->本地目录副本满足由通配符指定的通配符 用户。
此检查为恶意服务器提供了一些保护 发送意外的文件名,但存在被拒绝的风险 客户端和服务器通配符之间的差异导致需要的文件 扩展规则。
由于这个原因,这还会添加一个新的-T标志以禁用该检查。
他们添加了一个新标记-T
,它将忽略他们添加的此新检查,因此它是向后兼容的。但是,我想我们应该查看并找出为什么我们使用的文件名被标记为受限文件。