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

问题描述 投票:30回答:2

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

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

我收到此错误:

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

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

bash escaping scp
2个回答
64
投票

不是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:文件,它以[开头,或者在@[之前包含:并且不包含]:,但这通常不是很有用;-)


(下面的文字写的是当original question是如何在bash中逃脱冒号?它适用于那种情况,但不适用于scp,因为没有任何贝壳逃逸将有助于那里。)

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

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

(注意,null命令只是:,你可以有一个名为“:foo”的命令或函数,它可以在没有转义的情况下被调用,在这方面它与#不同,其中一个名为#foo的命令需要被转义。)


0
投票

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

scp `hostname`:/root/this/is/test/file.txt user@host:"/path/to/dest"
© www.soinside.com 2019 - 2024. All rights reserved.