繁体   English   中英

如何转义 Linux 中 scp 副本路径中的空格?

[英]How do I escape spaces in path for scp copy in Linux?

我想将文件从远程复制到本地系统。 现在我在 linux 系统中使用 scp 命令。 我有一些文件夹或文件名带有空格,当我尝试复制该文件时,它显示错误消息:“没有这样的文件或目录”。

我试过了:

scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

我在网上看到了一些参考资料,但我不太明白,有人可以帮忙吗?

在复制过程中如何转义文件名或目录名中的空格...

基本上你需要转义它两次,因为它在本地转义,然后在远程端转义。

您可以执行以下几个选项(在 bash 中):

scp user@example.com:"'web/tmp/Master File 18 10 13.xls'" .
scp user@example.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp user@example.com:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .

作品

scp localhost:"f/a\ b\ c" .

scp localhost:'f/a\ b\ c' .

不起作用

scp localhost:'f/a b c' .

原因是在将路径传递给 scp 命令之前,shell 会解释该字符串。 因此,当它到达遥控器时,遥控器正在寻找带有未转义引号的字符串,但它失败了

要查看此操作,请使用 -vx 选项启动 shell,即bash -vx ,它将在运行时显示命令的内插版本。

使用 3 个反斜杠来转义目录名称中的空格:

scp user@host:/path/to/directory\\\\\\ with\\\\\\ spaces/file ~/Downloads

应该将名为directory with spaces的远程目录中的file复制到您的Downloads目录, directory with spaces

您也可以执行以下操作:

scp foo@bar:"\"apath/with spaces in it/\""

第一级引号将由 scp 解释,然后第二级引号将保留空格。

我很难让它适用于包含带有空格的文件名的 shell 变量。 出于某种原因使用:

file="foo bar/baz"
scp user@example.com:"'$file'"

正如@Adrian 的回答似乎失败了。

事实证明,最好的方法是使用参数扩展在空格前添加反斜杠,如下所示:

file="foo bar/baz"
file=${file// /\\ }
scp user@example.com:"$file"

很抱歉使用这个 Linux 问题来为 Windows 10 上的 Powershell 提供这个提示:在这种情况下,用反斜杠转义或用引号包围的空格字符对我不起作用。 效率不高,但我使用“?”解决了它字符代替:

对于文件“tasks.txt Jun-22.bkp”,我使用“tasks.txt?Jun-22.bkp”下载了它

scp ael5105@192.168.0.200:/home/5105/test/gg/Untitled?Folder/a/qy.jpg /var/www/try/

? 在遥控器上做一个 glob 并将匹配任何字符,包括一个空格

我是 Linux 的新手,我使用了 Kali xD,我的工作原理如下:如果您想使用单个或多个空格传输文件,请从您的系统到远程服务器:

$ scp this\ is\ my\ file tryhackme@1.1.1.1:/home/tryhackme

注意IP地址只是示例,最后输入的是目录,美元符号是提示符,代码以scp开头。

您还可以在传输时指定该文件的名称,例如。 /home/tryhackme/file1或带有单个或多个空格,例如/home/tryhackme/"this\ is\ new\ file"

从远程服务器到您的系统,与上面的单个或多个空格相同:

$ scp tryhackme@1.1.1.1:/home/tryhackme/"remote\ server\ file" "this is mine now"

请注意,您只对要复制的文件使用反斜杠\\ ,因为您可以看到字符串"this is mine now"没有\\ ,因为这是传输到我们系统时我们想要的文件的名称而不是我们想要保护副本的文件 (scp)。 抱歉我的解释,我希望有人能理解,我希望这对需要其他解决方案的人有所帮助。

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

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

手动退出路径:

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可以正常工作。

如果文件或文件夹名称之间有空格,那么您只需在空格前添加一个黑色斜杠 '' ,然后将整个路径放在单引号 ('') 中,然后它就可以工作了。

例子:

假设文件夹名称是“测试文件夹”并且它在远程机器的 /home/ 中。 然后您可以使用以下 scp 命令访问或下载该文件夹。

scp -r <user>@<host>:'/home/Test\ Folder' .

在 linux-terminal 或 cmd 中,如果单词之间的路径中有任何空格,则必须使用引号 ('') ("") 标记。

你应该是这样的:

$ '/home/tryhackme'

不是

$ /home/tryhackme

只需将通配符粘贴在空格所在的位置:'foo/bar*bar.txt'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM