Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssh scp出现故障,并出现“故障”;协议错误:文件名与请求不匹配;_Ssh_Scp - Fatal编程技术网

Ssh scp出现故障,并出现“故障”;协议错误:文件名与请求不匹配;

Ssh scp出现故障,并出现“故障”;协议错误:文件名与请求不匹配;,ssh,scp,Ssh,Scp,我有一个脚本,它使用SCP从AWS上的远程Linux主机中提取文件。在每晚运行相同的代码大约6个月没有问题后,它今天开始失败,出现协议错误:文件名与请求不匹配。我在下面一些更简单的文件名上复制了这个问题: $ scp -i $IDENT $HOST_AND_DIR/"foobar" . # the file is copied successfully $ scp -i $IDENT $HOST_AND_DIR/"'foobar'" . protocol error: filename doe

我有一个脚本,它使用SCP从AWS上的远程Linux主机中提取文件。在每晚运行相同的代码大约6个月没有问题后,它今天开始失败,出现
协议错误:文件名与请求不匹配。我在下面一些更简单的文件名上复制了这个问题:

$ 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\u和\u DIR/“'foo bar'”
,但从今天开始,它只接受
$HOST\u和\u DIR/“foo\bar”
。所以,我的问题已经解决了,但我仍然好奇到底发生了什么

我在谷歌上搜索了错误消息,但我没有看到任何关于它的真实提及,这让我感到惊讶

所涉及的两台主机在
ssh-v localhost
的输出中都有
OpenSSL 1.0.2g
,并且
bash--version
表示
GNU bash,version 4.3.48(1)-发行版(x86_64-pc-linux-GNU)

有什么想法吗?

我最后查看了源代码,找到了引发此错误的提交:

远程->本地目录副本满足 用户

此检查提供了一些针对恶意服务器的保护 发送意外的文件名,但有被拒绝的风险 由于客户端和服务器通配符之间的差异而需要文件 扩展规则

出于这个原因,这还添加了一个新的-T标志来禁用检查


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

这不是一个有用的评论,但我今天刚刚开始得到这个,因为我已经每小时运行了一个月。只是在ubuntu上安装了更新后才发生的。我在这里发布了关于这个功能的另一个问题:非常有趣!我很确定我没有更新任何也会更新openssh内容的软件,但我刚刚了解了
/var/log/apt/history.log*
,似乎openssh是在今天早上通过
/usr/bin/Understand upgrade
更新的。在此之前,它最后一次自动升级是2018年11月。我根本不知道我的(非常普通的,未经简化的)系统正在自动更新。我没有看到任何东西说这个自动更新是EC2 Ubuntu上的默认设置,但我想它一定是。我们遇到了同样的问题,并且-t也为我们解决了这个问题。有趣的是,我们使用的绝对路径在src和dst中都没有任何通配符。我很想说这是上面提到的提交中的一个bug。在我们的环境中,由cron作业执行的PHP程序调用scp命令。当您执行
scp-T时,这很方便foo@bar:“/long filename/其中包含恼人的/空格/您不想/转义的”
别名scp='scp-T'
添加到您的
中。bashrc
将自动执行此操作。
将忽略他们添加的此新检查,因此它是向后兼容的
这不是向后兼容的工作方式。。。