我尝试使用 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)发出带有文件路径参数的命令时,您需要提供两次转义符(sftp
rsync
或者保护转义字符不被本地 shell 消耗/使用) 一次在本地机器上,另一次在远程机器上。