我正在尝试使用scp
中的bash
在源文件名中使用冒号(:
)字符复制文件。我正在使用的命令的混淆版本是:
scp file\:\ name.mp4 user@host:"/path/to/dest"
我收到此错误:
ssh: Could not resolve hostname Portal 2: Name or service not known
我知道我可以重命名该文件并删除:
,但我想知道是否可以逃脱冒号。
答案 0 :(得分:60)
不是bash
转义问题,scp
将x:
视为[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
的问题,您不需要,但“:
”有效。使用\:
的地方:
:
,不需要逃避,尽管你可以,就像:
它对命令没有影响(“没有效果”并不完全正确,如果你逃脱一个或更多字符会阻止别名匹配,而您可以别名\e\c\h\o foo
):
(和其他人,PATH
,CDPATH
)转义值没有任何有用的效果(我无法在包含{{的目录的PATH中运行程序1}},这有点出乎意料)MAILPATH
等等,:
必须为${name:-x}
,因此无需转义变量名称,并且由于没有歧义,因此无需转义后续name
在参数扩展的其他变体中[a-zA-Z_][a-zA-Z0-9_]
trinary仅对变量和数字起作用,无需转义:
和? :
类似于==
的模式中的类,您可以使用=~
进行转义,但我不知道它是如何有用的... [[:digit:]]
没有任何有用的效果(请注意,null命令只是\:
,您可以拥有一个名为“\:
”的命令或函数,并且可以在不转义的情况下调用它,在这方面它与{{1}不同其中一个名为:
的命令需要转义。)
答案 1 :(得分:0)
我尝试使用完全限定的路径作为@ mr.spuratic答案,但不起作用,在我的情况下,我必须使用绝对路径,这是我的解决方案:
scp `hostname`:/root/this/is/test/file.txt user@host:"/path/to/dest"