为什么传递 SCP 文件名时需要转义空格?

为什么传递 SCP 文件名时需要转义空格?

任何曾经使用过 SCP 的人都知道这可能行不通:

scp foo.txt '[email protected]:foo bar.txt'

就我而言,我得到的答案是:“目标模糊”。

SCP 的手册页没有解释为什么需要转义该空格,但该参数似乎符合手册页中列出的该参数的规范:

[[user@]host1:]file1 

我觉得很匹配。所以,为什么需要这样做:

scp foo.txt '[email protected]:foo\ bar.txt'

答案1

在第一种情况下,您指定两个文件作为复制目标,均位于 上remote.net。这显然是模棱两可的,因为程序无法确定将文件复制到何处。

考虑以下使用相同格式指定两个源文件和一个目标(目录)的工作示例:

scp '[email protected]:file1 file2' .

这将复制两个都 file1file2example.org到本地目录。


您的本地scp程序连接到远程主机并启动另一个实例,并scp使用参数确定您是否正在传输文件它(-f),或它(-t)。当您添加-v详细输出参数时,您可以看到这一点。您输入的源/目标参数(host:file)被拆分,文件名部分简单地附加为指定要使用的文件的附加参数。

当使用它作为来源

debug1: Sending command: scp -v -f -- file1 file2

这可以毫无问题地运行,它通过网络传输多个源文件。

当使用它作为下沉

debug1: Sending command: scp -v -t -- file1 file2

这会失败,因为你打算写入多个文件。现在解决这个问题的方法是转义文件名再次(一次用于本地 shell,一次用于远程调用):

$ scp foo '[email protected]:foo\ bar'
[...]
debug1: Sending command: scp -v -t -- foo\\ bar

并且,FWIW,效果同样好。scp foo '[email protected]:"foo bar"'

相关内容