2015-11-10 140 views
1

是的,我不知道它已被要求的千倍如何逃生空间在SCP,但我不能这样做与& - 符号,因此,如果这标志是部分目录名称。如何逃生和在SCP

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

的&迹象似乎搞乱的东西相当多了,使用\ &不能解决的则远程目录中找不到问题:通过省略

[[email protected] tmp]$ scp test.txt "bpi:/home/sorunome/test \& stuff" 
scp: ambiguous target 

甚至不引用和加\这个工作的地方:

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

那么,有什么想法吗?

+0

必须使用的zsh?我在bash下试了一下,它没有任何额外的转义。 – Aaron

+0

不,我不必使用zsh,我只是用bash试过它,并且它产生相同的效果(而不是它说“zsh:1”它现在说“bash”) 另外,只是为了如此感兴趣只是试过'scp test.txt“bpi:/ home/sorunome/test&touch test.tmp”' ,它确实在我的远程家庭中创建了test.tmp文件! – Sorunome

+0

是的,我实际上已经在本地测试'&',当在远程端测试时,我重现了你的错误。我正在寻找一种方法来避免它 – Aaron

回答

3

逃离两空间和符号的伎俩对我来说:仍然需要某种原因

scp source_file "[email protected]:/dir\ with\ spaces\ \&\ ampersand" 

的报价。

+0

奇怪,这似乎是工作!但是,如何将它添加到bash脚本中的变量? – Sorunome

+0

这似乎是这样做的:'scp'$(sprintf%q“$ local”)“”$(sprintf%q“$ remote”)“' – Sorunome

+1

需要引号来保护反斜杠本身。 'scp'有点棘手,因为参数会被处理两次:在运行'scp'之前由本地shell执行一次,并且在文件名被发送到远程主机之后再次执行*。 (这可能有助于将'scp'想象成一个类似'cat source_file | ssh user @ host'cat>“/ dir with space& – chepner

0

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

使用cp,你可以使用正常的转义特殊字符的方法,在特殊字符前面加上反斜杠。例如,对于空间中的路径可以通过使用被复制:

cp photo.jpg My\ Pictures/photo.jpg

在SCP的远程路径不工作使用这种方法逸出。您需要使用双反斜杠来转义特殊字符。使用相同的例子,我的照片文件夹,将有它的空间使用转义:

scp photo.jpg "[email protected]:/home/user/My\\ Photos/photo.jpg"

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

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