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

Nat*_*nes 35 bash scp escaping

我正在尝试使用scpin 在源文件名中bash使用冒号(:)字符复制文件.我正在使用的命令的混淆版本是:

scp file\:\ name.mp4 user@host:"/path/to/dest"
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ssh: Could not resolve hostname Portal 2: Name or service not known
Run Code Online (Sandbox Code Playgroud)

我知道我可以重命名文件并删除它:,但我想知道是否可以逃脱冒号.

mr.*_*tic 68

并不完全是bash逃避问题,它的scp治疗x:作为[用户@]主机前缀,请尝试:

scp ./file:\ name.mp4 user@host:"/path/to/dest"
Run Code Online (Sandbox Code Playgroud)

使用相对(例如./)或完全限定的路径(/path/to/source)可防止此行为 - /在a之前存在:导致OpenSSH停止检查可能的host:user@host:前缀).

OpenSSH scp唯一的特殊情况文件名,以冒号开头,允许那些没有问题的工作,它不支持:在正常意义上转义a ,并且没有其他有效主机名的概念,所以几乎任何带有a的文件名:都可能导致这个(或等效的)如果[ ]在之前找到IPv6行为:).

这也会影响其他程序,例如rsync,同样的解决方法适用于那里.

(由于OpenSSH的公司的简单解析[]封闭的IPv6地址,就可以顺利scp的文件包含:与启动[,或者包含@[以前:,不含有]:,但是这不是一般有用;-)


(下面的文字是最初的问题如何在bash中逃避冒号的时候它适用于那种情况,但不适用于scp没有任何数量的shell 转移会对那里有帮助.)

要回答关于如何逃避的问题:,你不需要,但" \:"有效.使用的地方::

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

(注意,null命令只是:,您可以使用一个名为" :foo" 的命令或函数,并且可以在不转义的情况下调用它,在这方面它与#命名的命令#foo需要转义的位置不同.)