安全复制 (scp) 文件名中带空格的问题

安全复制 (scp) 文件名中带空格的问题

我正在尝试使用安全复制(scp)复制文件。我正在尝试执行以下命令,但由于目录位置的绝对路径中存在空格而出现错误。

scp -r -P 8484 [email protected]:/media/New Volume/lj /home/pratheep

我收到以下错误:

scp: /media/New: No such file or directory  
scp: Volume/lj: No such file or directory

我尝试使用相同的命令添加额外的反斜杠,例如

scp -r -P 8484 [email protected]:/media/New\ Volume/lj /home/pratheep

但我仍然遇到同样的错误。

有人可以告诉我如何纠正它吗?

答案1

您应该引用文件名两次,一次用于本地 shell,一次用于远程 shell。在最简单的情况下,您可以执行以下操作之一

scp -r -P 8484 [email protected]:"'/media/New Volume/lj'" /home/pratheep
scp -r -P 8484 [email protected]:'"/media/New Volume/lj"' /home/pratheep

或使用制表符补全的帮助

scp -r -P 8484 [email protected]:/media/New\\\ Volume/lj /home/pratheep

答案2

scp并将rsync远程文件名传递给远程 shell。这允许您传递模式,如

scp remotehost:'*.txt' .

但它有一个令人讨厌的后果,即在提供远程文件名时需要额外的引用。

您可以传递该-s选项以rsync使其保护文件名不被远程 shell 扩展。但这会打开 rsync 的内置通配符扩展,因此您仍然需要引用\[?*.

解决方法是传输存档:

ssh -P 8484 [email protected] 'cd "/media/New Volume" && tar cf - lj' |
tar xf - -C /home/pratheep

另一种方法是挂载远程文件系统,然后使用普通工具执行复制。

mkdir mnt
sshfs -p 8484 [email protected]:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt

答案3

当尝试使用scpBash 脚本从包含空格的远程路径复制文件时,我遇到了类似的问题。

以下是我提出的解决方案:

手动退出路径:

scp user@host:'dir\ with\ spaces/file\ with\ spaces' <destination>
scp user@host:"dir\\ with\\ spaces/file\\ with\\ spaces" <destination>
scp user@host:dir\\\ with\\\ spaces/file\\\ with\\\ spaces <destination>

注意:不需要选项-T(见下文)。

使用双引号 + 选项-T

scp -T user@host:"'<path-with-spaces>'" <destination>
scp -T user@host:'"<path-with-spaces>"' <destination>
scp -T user@host:"\"<path-with-spaces>\"" <destination>

注意:如果没有选项-T,这些命令将产生protocol error: filename does not match request.详细讨论了原因这里

使用 printf 的转义路径:

source="<path-with-spaces>"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>

注意:这在没有选项的情况下工作正常-T,但仅适用于单个文件。对于多个文件,-T再次需要选项(与上面相同的错误)。

相关内容