如何scp文件名中带冒号的文件?

时间:2013-02-05 23:10:32

标签: bash escaping scp

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

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

我收到此错误:

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

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

2 个答案:

答案 0 :(得分:60)

不是bash转义问题,scpx:视为[user @]主机前缀,请尝试:

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

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

OpenSSH的scp只有启动的特殊情况文件名,带有冒号,允许这些文件没有问题,它不支持在正常意义上转义:,并且没有其他有效主机名的概念,因此几乎任何带有:的文件名都可能导致此问题(如果在[之前找到] :,则会产生等效的IPv6行为。

这也会影响其他程序,例如rsync,同样适用于此处。

(由于OpenSSH对[]封闭的IPv6地址的简单解析,您可以成功scp包含:的{​​{1}}文件,其中包含[,或包含@[:之前并且不包含]:,但这通常不常用; - )


original question 下面的文字如何在bash中转义冒号?它适用于那种情况,但不适用于{ {1}}因为没有任何shell转义会有帮助。)

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

  1. null命令:,不需要逃避,尽管你可以,就像:它对命令没有影响(“没有效果”并不完全正确,如果你逃脱一个或更多字符会阻止别名匹配,而您可以别名\e\c\h\o foo
  2. :(和其他人,PATHCDPATH)转义值没有任何有用的效果(我无法在包含{{的目录的PATH中运行程序1}},这有点出乎意料)
  3. 参数展开MAILPATH等等,:必须为${name:-x},因此无需转义变量名称,并且由于没有歧义,因此无需转义后续name在参数扩展的其他变体中
  4. [a-zA-Z_][a-zA-Z0-9_] trinary仅对变量和数字起作用,无需转义
  5. :? :类似于==的模式中的类,您可以使用=~进行转义,但我不知道它是如何有用的...
  6. 在命令或函数名称中,无需转义,[[:digit:]]没有任何有用的效果
  7. (请注意,null命令只是\:,您可以拥有一个名为“\:”的命令或函数,并且可以在不转义的情况下调用它,在这方面它与{{1}不同其中一个名为:的命令需要转义。)

答案 1 :(得分:0)

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

scp `hostname`:/root/this/is/test/file.txt user@host:"/path/to/dest"