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