54

我正在尝试使用源文件名scpbash带有冒号 ( :) 字符的 in 复制文件。我正在使用的命令的混淆版本是:

scp file\:\ name.mp4 user@host:"/path/to/dest"

我收到此错误:

ssh: Could not resolve hostname Portal 2: Name or service not known

我知道我可以重命名文件并删除:,但我想知道是否可以转义冒号。

4

2 回答 2

101

不是一个bash逃避问题,它被scp视为x:[user@]host 前缀,请尝试:

scp ./file:\ name.mp4 user@host:"/path/to/dest"

使用相对(例如./)或完全限定路径(/path/to/source)可以防止这种行为 -/之前的存在:导致 OpenSSH 停止检查可能的host:user@host:前缀)。

OpenSSHscp唯一以冒号开头的特殊情况文件名允许它们正常工作,它不支持:在正常意义上转义 a,并且没有其他有效主机名的概念,因此几乎任何带有 a 的文件名:都可能导致这种情况(或等效如果[ ]在之前找到IPv6 行为:)。

这也可能影响其他程序,例如rsync,同样的解决方法适用于那里。

(由于 OpenSSH 对[]封闭的 IPv6 地址的简单解析,您可以成功地scp包含:[@[:]:


下面的文字是最初的问题如何在 bash 中转义冒号时编写的?它适用于这种情况,但不适用于scp任何 shell 转义都无济于事。)

要回答有关如何逃脱的问题:,您不需要,但“ \:”有效。使用a 的地方:

  1. 空命令:,不需要转义,虽然你可以,就像\e\c\h\o foo它对命令没有影响一样(“没有影响”并不完全正确,如果你转义一个或多个字符,它会阻止别名被匹配,你可以别名:
  2. PATH(和其他人,CDPATH, MAILPATH)转义值没有有用的效果(我无法从包含 a 的目录中运行我的 PATH 中的程序:,这有点出乎意料)
  3. 参数扩展${name:-x}等等,name必须是[a-zA-Z_][a-zA-Z0-9_],所以不需要转义变量名称,并且由于没有歧义,不需要:在参数扩展的其他变体中转义后续
  4. ? :trinary 只对变量和数字进行操作,无需转义
  5. ==并且=~像这样的模式中的类[[:digit:]],你可以逃脱,\:但我不知道这可能会有什么用......
  6. 在命令或函数名称中,无需转义,\:没有任何用处

(请注意,空命令只是:,您可以拥有一个名为 " :foo" 的命令或函数,并且可以在不转义的情况下调用它,在这方面,它与需要转义的命令不同。##foo

于 2013-02-05T23:16:26.910 回答
1

我尝试使用完全限定的路径作为@mr.spuratic 的答案,但不起作用,在我的情况下,我必须使用绝对路径,这是我的解决方案:

scp `hostname`:/root/this/is/test/file.txt user@host:"/path/to/dest"
于 2019-02-21T10:08:28.797 回答