我经常scp
将文件从我的 Android 设备传输到我的 MacBook,这就像一个魅力。但我John's folder
的 MacBook 上有一个名为的文件夹,因此当我尝试复制该目录中的文件时,例如
scp [email protected]:/Users/macbook/desktop/John\'s\ folder/file storage/folder
它会返回一个错误
unexpected EOF error while looking for matching \`’\`
和
unexpected end of file
我该如何解决这个问题?
答案1
作为OpenSSH 版本 9.0发布于2022-04-08,该scp
程序现在直接使用SFTP协议。因此,原来的问题不再存在,因此不再需要此答案的其余部分。
如果您使用的是 的旧版本scp
,或者您想使用 恢复到旧的 SCP 协议scp -O
,答案仍然适用。
原始答案如下。
这很有趣。我看到的其他答案是告诉您将转义引号和转义空格交换为带引号的字符串。实际上它们是等效的,因此您不会看到任何变化(a\'\ b
与 shell 相同"a' b"
)。
scp
这里的问题在于远程系统解释所给出的命令行。
举个例子,这可以工作:
scp John\'s\ folder/file localhost:/tmp/dst
但这会失败:
scp localhost:/tmp/src/John\'s\ folder/file /tmp/dst
(我已经用于localhost
示例;您应该user@host
根据您的情况使用。)
如果您包括-v
(冗长的) 标志上scp
您可以准确地看到导致失败的原因:
debug1: Sending command: scp -v -f /tmp/src/John's folder/file
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
这里不幸的解决方案是您需要转义特殊字符(包括空格)两次 - 一次用于本地 shell,一次用于远程 shell:
scp localhost:"/tmp/src/John\'s\ folder/file" /tmp/dst
答案2
SCP 需要在引号中包含一整个参数。我面前的两个不同答案部分正确,但正确答案是
scp "[email protected]:/Users/macbook/desktop/John's folder/file" storage/folder
请注意,第一个参数用引号括起来,但第二个参数不是 - 如果两个参数都像注释所建议的那样用引号括起来,则 /bin/scp 会将其作为单个参数调用,并在此之后期待另一个参数。
scp "[email protected]:/Users/macbook/desktop/John's folder/file storage/folder"
将被读取为单个参数。即使那里有一个空格,双引号也可以避免这个空格。
最后,将引号放在参数中间,例如将参数切成两半,并且对 shell 没有意义,因为 user@host:/path/to/directory 是一个完整参数。您可以使用它的一部分,但不能将其切成两半,否则它将被视为 2 个不同的参数。scp [email protected]:"/Users/macbook/desktop/John's folder/file" storage/folder
答案3
三重逃脱对我有用:
scp [email protected]:bob\\\'s\\\ file /local/path/
这些也有效:
scp "[email protected]:bob\'s\ file" /local/path/
scp [email protected]:"bob\'s\ file" /local/path/
这些不:
scp "[email protected]:bob's file" /local/path/
scp [email protected]:bob\'s\ file /local/path/