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

Posted

技术标签:

【中文标题】如何 scp 文件名中带有冒号的文件?【英文标题】:How can I scp a file with a colon in the file name? 【发布时间】:2013-01-21 00:58:00 【问题描述】:

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

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

我收到此错误:

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

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

【问题讨论】:

【参考方案1】:

不完全是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文件包含:[开头,或者在:之前包含@[而不包含@ 987654345@ ,但这通常没有用;-)


(下面的文字是在 original question 是 如何在 bash 中转义冒号? 它适用于那种情况,但不适用于 scp因为再多的外壳逃逸都无济于事。)

要回答关于如何 逃离: 的问题,您不需要这样做,但“\:”可以。使用: 的地方:

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

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

【讨论】:

同样的问题影响rsync。幸运的是,同样的解决方案——在文件名前加上./——也有帮助。 三进制 :) 还是三进制?【参考方案2】:

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

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

【讨论】:

以上是关于如何 scp 文件名中带有冒号的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何scp名称中带有空格的目录[重复]

通过 pyspark 加载文件名中包含冒号的 Amazon S3 文件

SCP注意事项

如何在hibernate和postgresql中读出名称中带有冒号(:)的列

名称中带有冒号的 XElement 不起作用 [重复]

Powershell - 展开存档并重命名文件,因为它包含无效字符