shell 如何在scp中转义&

n7taea2i  于 2022-12-27  发布在  Shell
关注(0)|答案(5)|浏览(232)

是的,我确实意识到已经被问了上千次如何在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

所以,有什么想法吗?

hpcdzsge

hpcdzsge1#

去掉空格和“与”符号对我来说很有效:

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

出于某种原因,这些引用仍然是必要的。

ltqd579y

ltqd579y2#

当使用scp或cp时,特殊字符可能会中断文件路径。您可以通过转义特殊字符来解决此问题。
使用cp可以使用转义特殊字符的常规方法,即在特殊字符前加一个反斜杠。例如,可以使用以下命令复制带空格的路径:
第一个月
scp中的远程路径无法使用此方法进行转义。您需要使用双反斜杠转义特殊字符。使用相同的示例,My Photos文件夹将使用以下方法进行空间转义:
scp photo.jpg "user@remotehost:/home/user/My\\ Photos/photo.jpg"
双引号也很重要,包含特殊字符的整个路径必须用双引号括起来。
来源:https://dominichosler.wordpress.com/2011/08/27/using-scp-with-special-characters/

v8wbuo2f

v8wbuo2f3#

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

brgchamk

brgchamk4#

用另一对\"将文件名括起来,如下所示:

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

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

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

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

wswtfjt7

wswtfjt75#

这就是我的工作:

function escape_file() {
    local ESCAPED=$(echo "$1" | sed -E 's:([ ()[!&<>"$*,;=?@\^`{}|]|]):\\\1:g' | sed -E "s/([':])/\\\\\1/g")
    echo "$ESCAPED"
}
REMOTE_FILE="/tmp/Filename with & symbol's! (xxx) [1.8, _aaa].gz"
scp "server:$(escape_ "$REMOTE_FILE")" /tmp/

相关问题