【问题标题】:How can I scp a file with a colon in the file name?如何 scp 文件名中带有冒号的文件?
【发布时间】: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

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

【问题讨论】:

    标签: bash escaping scp


    【解决方案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因为再多的外壳逃逸都无济于事。)

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

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

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 2018-03-30
      • 2014-05-08
      • 2011-12-20
      • 2021-10-07
      • 2012-11-26
      • 2014-08-18
      相关资源
      最近更新 更多