scp失败,出现"协议错误:文件名与请求不匹配"

dcc*_*310 12 ssh scp

我有一个脚本使用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...
Run Code Online (Sandbox Code Playgroud)

我单引号的原因是我最初抓住了名字中带有空格的文件.为了处理空间,我已经做$HOST_AND_DIR/"'foo bar'"了好几个月,但从今天开始,它只会接受$HOST_AND_DIR/"foo\ bar".所以,我的问题固定的,但我仍然对正在发生的事情感到好奇.

我用Google搜索了错误信息,但我没有看到任何真实的提及,这让我感到惊讶.

所涉及的两个主机都有OpenSSL 1.0.2g输出ssh -v localhost,并bash --versionGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu) 任何想法?

JBo*_*ond 26

我最后查看了源代码并找到了抛出此错误的提交:

GitHub提交

remote->本地目录副本满足用户指定的通配符.

此检查可以防止恶意服务器发送意外的文件名,但由于客户端和服务器通配符扩展规则之间存在差异,因此存在拒绝所需文件的风险.

因此,这还会添加一个新的-T标志来禁用检查.

他们添加了一个新标志-T,忽略了他们添加的新检查,因此它向后兼容.但是,我想我们应该查看并找出为什么我们使用的文件名被标记为受限制.

  • `这将忽略他们添加的新检查,因此它是向后兼容的`这不是向后兼容性的工作原理...... (4认同)
  • 我们遇到了同样的问题, -T 也为我们修复了它。有趣的是,我们在 src 和 dst 中都使用了没有任何通配符的绝对路径。我很想说这是上面提到的提交中的一个错误。在我们的环境中,scp 命令由一个由 cron 作业执行的 PHP 程序调用。 (3认同)
  • 这在您执行`scp -T“ foo @ bar:'/ long filename /里面有烦人的/空格/不想/要转义的'时很方便” (2认同)
  • 将 `alias scp='scp -T'` 添加到您的 `.bashrc` 将自动执行此操作。 (2认同)