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

标签 bash escaping scp

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

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

我收到这个错误:

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

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

最佳答案

不完全是 bash 转义问题,它是 scpx: 视为 [user@]host 前缀,尝试:

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 因为再多的 shell 转义也无济于事。)

要回答有关如何转义 : 的问题,您不需要回答,但“\:”可以。使用:的地方:

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

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

关于bash - 如何 scp 文件名中带有冒号的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14718720/

相关文章:

linux - 有没有更好的方法来模拟标准输入?

c++ - 如何使用反斜杠对字符串进行字符串化

html - 在 Zend SubForm 中,如何将 Legend escape 设置为 false?

用于转义/清理 XML 的 Java 库?

linux - rsync ssh 递归试运行错误/服务器上没有 rsync

Linux - 仅将新文件从一台服务器复制到另一台服务器

amazon-web-services - 如何从 EC2 实例下载文件到本地计算机

node.js - 如何在 Node 中的 child.process.exec 中使用的命令中转义 URL 中的字符

python - python 错误退出后未执行 Bash 陷阱

linux - 比较两个逗号分隔的字符串