【问题标题】:How to escape & in scp如何在 scp 中逃脱
【发布时间】:2016-02-11 09:43:28
【问题描述】:

是的,我确实意识到如何在 scp 中转义 空格 已经被问了一千次了,但是我没有使用 &-符号来做到这一点,所以如果该符号是目录名称的一部分。

[sorunome@sorunome-desktop tmp]$ scp test.txt "bpi:/home/sorunome/test & stuff"
zsh:1: command not found: stuff
lost connection

& 符号似乎有点搞砸了,使用 \& 并不能解决问题,因为找不到远程目录:

[sorunome@sorunome-desktop tmp]$ scp test.txt "bpi:/home/sorunome/test \& stuff"
scp: ambiguous target

即使省略引号并在所有工作的地方添加 \ 也不行:

[sorunome@sorunome-desktop tmp]$ scp test.txt bpi:/home/sorunome/test\ \&\ stuff
zsh:1: command not found: stuff
lost connection

那么,有什么想法吗?

【问题讨论】:

  • 必须使用 zsh 吗?我在 bash 下尝试过,它没有任何额外的转义就可以工作。
  • 不,我不必使用 zsh,我只是用 bash 尝试了它,它产生了相同的效果(而不是它说“zsh:1”现在说“bash”)另外,只是因为很感兴趣,我刚刚尝试了scp test.txt "bpi:/home/sorunome/test & touch test.tmp",它确实在我的远程家中创建了文件 test.tmp!

标签: shell escaping scp


【解决方案1】:

同时转义空格和 & 符号对我有用:

scp source_file "user@host:/dir\ with\ spaces\ \&\ ampersand"

由于某种原因仍然需要引号。

【讨论】:

  • 奇怪,这似乎有效!关于如何将它添加到 bash 脚本中的变量的任何想法?
  • 这似乎是这样做的:scp "$(sprintf %q "$local")" "$(sprintf %q "$remote")"
  • 引号是用来保护反斜杠本身的。 scp 有点棘手,因为参数被处理了两次:在运行 scp 之前由本地 shell 处理一次,在文件名发送到远程主机之后再次。 (将scp 视为cat source_file | ssh user@host 'cat > "/dir with spaces & ampersand"' 之类的包装器可能会有所帮助
【解决方案2】:

使用 scp 或 cp 时,特殊字符可能会破坏文件路径。你可以通过转义特殊字符来解决这个问题。

使用 cp 您可以使用转义特殊字符的常规方法,即在它前面加上一个反斜杠。例如,可以使用以下命令复制带有空格的路径:

cp photo.jpg My\ Pictures/photo.jpg

scp 中的远程路径无法使用此方法进行转义。您需要使用双反斜杠转义特殊字符。使用相同的示例,“我的照片”文件夹将使用以下命令对其空间进行转义:

scp photo.jpg "user@remotehost:/home/user/My\\ Photos/photo.jpg"

双引号也很重要,带有特殊字符的整个路径必须用双引号括起来。

来源:https://dominichosler.wordpress.com/2011/08/27/using-scp-with-special-characters/

【讨论】:

    【解决方案3】:

    如果您需要转义%,请使用%%

    【讨论】:

      【解决方案4】:

      将文件名括在另外一对 \" 中,如下所示:

      scp "test.txt" "bpi:/home/sorunome/\"test & stuff\""
      

      由于文件名内部不需要更改任何内容,因此可以直接将其应用于变量:

      scp "$local" "bpi:/home/sorunome/\"$remote\""
      

      外部引号 (") 由本地 shell 解释。内部引号 (\") 在远程服务器上进行解释。感谢@chepner 指出如何处理两次参数。

      【讨论】:

        猜你喜欢
        • 2017-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        相关资源
        最近更新 更多