使用 scp 复制包含空格的远程文件需要双空格转义。为什么?

使用 scp 复制包含空格的远程文件需要双空格转义。为什么?

我尝试使用 scp 将文件从远程计算机复制到我的计算机。我遇到的问题出现在远程计算机的路径包含一些空格时,例如:

scp [email protected]:/home/userxxx/Documents/folder 1/test.txt /home/userxxx/Documents/folder_1/

这显然不起作用:

scp:/home/userxxx/Documents/folder:没有此文件或目录
scp:1/test.txt:没有此文件或目录

我尝试了我所知道的关于使用反弹来逃避空间的方法:

scp [email protected]:/home/userxxx/Documents/folder\ 1/test.txt /home/userxxx/Documents/folder_1/

并引用:

scp [email protected]:'/home/userxxx/Documents/folder 1/test.txt' /home/userxxx/Documents/folder_1/

但两次都失败了。

我发现唯一有效的方法是将它们结合起来(!)(建议在这里):

scp [email protected]:'/home/userxxx/Documents/folder\ 1/test.txt' /home/userxxx/Documents/folder_1/

那么,我的问题是为什么会发生这种情况?这是否意味着远程路径(因为我认为问题仅发生在远程路径中)由于某种原因被解析了两次,因此仅应用一种转义方法不起作用?

答案1

您可以启用在执行命令之前打印命令跟踪查看在这三种情况下set -x实际传递了什么,scp如下所示:

ubuntu@ubuntu:~/test$ mkdir 'folder 1'
ubuntu@ubuntu:~/test$ touch 'folder 1'/test.txt
ubuntu@ubuntu:~/test$ mkdir foldr_1
ubuntu@ubuntu:~/test$ set -x


ubuntu@ubuntu:~/test$ scp ubuntu@localhost:/home/ubuntu/test/folder\ 1/test.txt /home/ubuntu/test/foldr_1/
+ scp 'ubuntu@localhost:/home/ubuntu/test/folder 1/test.txt' /home/ubuntu/test/foldr_1/
ubuntu@localhost's password: 
scp: /home/ubuntu/test/folder: No such file or directory
scp: 1/test.txt: No such file or directory


ubuntu@ubuntu:~/test$ scp ubuntu@localhost:'/home/ubuntu/test/folder 1/test.txt' /home/ubuntu/test/foldr_1/
+ scp 'ubuntu@localhost:/home/ubuntu/test/folder 1/test.txt' /home/ubuntu/test/foldr_1/
ubuntu@localhost's password: 
scp: /home/ubuntu/test/folder: No such file or directory
scp: 1/test.txt: No such file or directory


ubuntu@ubuntu:~/test$ scp ubuntu@localhost:'/home/ubuntu/test/folder\ 1/test.txt' /home/ubuntu/test/foldr_1/
+ scp 'ubuntu@localhost:/home/ubuntu/test/folder\ 1/test.txt' /home/ubuntu/test/foldr_1/
ubuntu@localhost's password: 
test.txt                                                                                                       100%    0     0.0KB/s   00:00     

因此,正如您在第一种和第二种情况下看到的那样,拆分发生在远程计算机上,因为转义符未传递给它……而在第三种情况下,进行了双重转义(显然也可以通过同时使用双引号和单引号(即'" ... "'或三重反斜杠)来实现。\\\) 例如:

scp ubuntu@localhost:'"/home/ubuntu/test/folder 1/test.txt"' /home/ubuntu/test/foldr_1/

或者

scp ubuntu@localhost:/home/ubuntu/test/folder\\\ 1/test.txt /home/ubuntu/test/foldr_1/

转义符被传递到远程计算机,并且路径被正确转换……基本上与远程客户端(如、、和scp...ssh等)类似,当从本地计算机(本地 shell)发出带有文件路径参数的命令时,您需要提供两次转义符(sftprsync或者保护转义字符不被本地 shell 消耗/使用) 一次在本地机器上,另一次在远程机器上。

相关内容