scp 到路径中带有空格的远程 Windows 主机:目标不明确

Wil*_*man 7 scp windows escape-characters

我正在尝试将文件从本地 Linux 计算机传输到远程 Windows 计算机,并且在 scp 处理带空格的 Windows 文件路径的方式上发现了一些不一致的情况...

这是可行的,请注意,本地文件的路径中的空格已正确转义:

scp /home/will/file\ with\ spaces.txt remote@host:D:/Users/will/Downloads/
Run Code Online (Sandbox Code Playgroud)

然而,尽管“Google Drive”文件夹中的空间被正确转义,但这不起作用:

scp /home/will/file\ with\ spaces.txt remote@host:D:/Users/will/Google\\ Drive/Documents/Computer_Stuff/Home_Lab/folder
Run Code Online (Sandbox Code Playgroud)

我在网上浏览了大量资源,人们遇到了类似的问题,但他们的所有解决方案都不适合我。

我尝试将 Windows 文件路径放在双引号、单引号中,带或不带转义空格;我尝试过使用双倍\\和三倍\\\来逃避空格;我什至尝试转义冒号 ( D\:); 我尝试明确指定目标文件名,但没有。什么都没起作用。

然后我找到了这个答案只有方法#2有效!为什么?'"、 和中包围 Windows 文件路径有什么区别"'?为什么我可以在本地 Linux 文件路径中完全不使用任何引号而简单地转义空格,但在远程 Windows 路径中却不能?

S3D*_*DEV 7

正如问题中提到的并在这里回答的,方法 2是适用于我的案例的解决方案。添加为答案,以方便后来的读者。

  • Windows 10
  • git bashscp

单/双引号:
scp ./myfile.txt user@host:'"/c:/AppName/a poorly named dir/sub_dir/myfile.txt"'


Dop*_*oti 0

你的 shell 正在看到Google\\ Drive,并将其解析为Google,后跟一个字面上的反斜杠,一个空格(它将参数分隔开scp,后跟Drive,然后将其传递给 SCP,现在你正在发送它,它不知道该怎么做争论太多。

为了更清楚地说明这一点,请比较 shell 如何解析Google\ DriveGoogle\\ Drive

$ cat 443236.sh
#!/bin/bash
foo=(Google\ Drive)
echo "Unrolling \$foo[@]:"
for f in "${foo[@]}"; do
  echo "'$f'"
done
foo=(Google\\ Drive)
echo "Unrolling \$foo[@]:"
for f in "${foo[@]}"; do
  echo "'$f'"
done
$ ./443236.sh
Unrolling $foo[@]:
'Google Drive'
Unrolling $foo[@]:
'Google\'
'Drive'
Run Code Online (Sandbox Code Playgroud)