我正在尝试使用源文件名scp
中bash
带有冒号 ( :
) 字符的 in 复制文件。我正在使用的命令的混淆版本是:
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@]host 前缀,请尝试:
scp ./file:\ name.mp4 user@host:"/path/to/dest"
使用相对(例如./
)或完全限定路径(/path/to/source
)可以防止这种行为 -/
之前的存在:
导致 OpenSSH 停止检查可能的host:
或user@host:
前缀)。
OpenSSHscp
唯一以冒号开头的特殊情况文件名允许它们正常工作,它不支持:
在正常意义上转义 a,并且没有其他有效主机名的概念,因此几乎任何带有 a 的文件名:
都可能导致这种情况(或等效如果[
]
在之前找到IPv6 行为:
)。
这也可能影响其他程序,例如rsync
,同样的解决方法适用于那里。
(由于 OpenSSH 对[]
封闭的 IPv6 地址的简单解析,您可以成功地scp
包含:
以[
@[
:
]:
(下面的文字是在最初的问题是如何在 bash 中转义冒号时编写的?它适用于这种情况,但不适用于scp
任何 shell 转义都无济于事。)
要回答有关如何逃脱的问题:
,您不需要,但“ \:
”有效。使用a 的地方:
:
:
,不需要转义,虽然你可以,就像\e\c\h\o foo
它对命令没有影响一样(“没有影响”并不完全正确,如果你转义一个或多个字符,它会阻止别名被匹配,你可以别名:
)PATH
(和其他人,CDPATH
, MAILPATH
)转义值没有有用的效果(我无法从包含 a 的目录中运行我的 PATH 中的程序:
,这有点出乎意料)${name:-x}
等等,name
必须是[a-zA-Z_][a-zA-Z0-9_]
,所以不需要转义变量名称,并且由于没有歧义,不需要:
在参数扩展的其他变体中转义后续? :
trinary 只对变量和数字进行操作,无需转义==
并且=~
像这样的模式中的类[[:digit:]]
,你可以逃脱,\:
但我不知道这可能会有什么用......\:
没有任何用处(请注意,空命令只是:
,您可以拥有一个名为 " :foo
" 的命令或函数,并且可以在不转义的情况下调用它,在这方面,它与需要转义的命令不同。#
)#foo
我尝试使用完全限定的路径作为@mr.spuratic 的答案,但不起作用,在我的情况下,我必须使用绝对路径,这是我的解决方案:
scp `hostname`:/root/this/is/test/file.txt user@host:"/path/to/dest"