![为什么传递 SCP 文件名时需要转义空格?](https://linux22.com/image/1350954/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%A0%E9%80%92%20SCP%20%E6%96%87%E4%BB%B6%E5%90%8D%E6%97%B6%E9%9C%80%E8%A6%81%E8%BD%AC%E4%B9%89%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
任何曾经使用过 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' .
这将复制两个都 file1
并file2
从example.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"'