Shell 如何逃离&;在scp中

Shell 如何逃离&;在scp中,shell,escaping,scp,Shell,Escaping,Scp,是的,我知道有人问过它一千次如何在scp中转义空格,但我没有用&-符号来转义,所以如果该符号是目录名的一部分 [sorunome@sorunome-desktop tmp]$ scp test.txt "bpi:/home/sorunome/test & stuff" zsh:1: command not found: stuff lost connection &符号似乎把事情弄得一团糟,使用\&无法解决问题,因为此时找不到远程目录: [sorunome@sorunome-deskt

是的,我知道有人问过它一千次如何在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

那么,有什么想法吗?

逃离空格和符号,并为我做了一个小动作:

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

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

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

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

cp photo.jpg My\Pictures/photo.jpg

使用此方法转义scp中的远程路径无效。您需要使用双反斜杠转义特殊字符。使用相同的示例,My Photos文件夹的空间将通过以下方式转义:

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

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


来源:

如果需要转义
%
请使用
%

将文件名用另一对
\“
环绕,如下所示:

scp "test.txt" "bpi:/home/sorunome/\"test & stuff\""
由于文件名内部无需更改,因此可以直接应用于变量:

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

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

必须使用zsh吗?我在bash下尝试过,但没有任何额外的转义。不,我不必使用zsh,我只是在bash中尝试过,它会产生相同的效果(而不是说“zsh:1”)它现在说“bash”),也正是因为如此感兴趣,我才尝试了
scp test.txt“bpi:/home/sorunome/test&touch test.tmp”
,它确实在我的远程家中创建了test.tmp文件!奇怪,这似乎起作用了!但是,你知道如何将其添加到bash脚本中的变量吗?这似乎是在做:
scp“$(sprintf%q“$local”)“$(sprintf%q“$remote”)”
需要引号来保护反斜杠本身
scp
有点棘手,因为参数会被处理两次:一次是在运行
scp
之前由本地shell处理,另一次是在将文件名发送到远程主机之后处理。(将
scp
看作是
cat source_file | ssh之类的东西的包装器可能会有所帮助user@host“cat>”/dir,带空格和符号“