如何在Linux中转义scp拷贝路径中的空格?

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

我试着:

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

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

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

266206 次浏览

作品

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


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

不起作用

scp localhost:'f/a b c' .

原因是在将路径传递给scp命令之前,shell会对字符串进行解释。因此,当它到达远程时,远程正在寻找一个带未转义引号的字符串,它失败了

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

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

有几个选项你可以做(在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 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"

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

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

应该从名为directory with spaces的远程目录中将file复制到你的Downloads目录。

对不起,我用这个Linux问题把这个技巧放在Windows 10的Powershell上:用反斜杠转义的空格字符或用引号括起来的空格字符在这种情况下不适合我。效率不高,但我用“?”char来解决它:

“tasks.txt”文件6月22日。我用"tasks.txt?Jun-22.bkp"下载的

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

的吗?远程和将匹配任何字符,包括空格吗

在尝试从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失败。原因在详细讨论在这里

使用Bash的printf转义路径:

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

用于shell的一行代码:

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

注意:没有选项-T也能正常工作。

如果文件或文件夹名称之间有空格,那么你可以简单地在空格前添加一个黑色斜杠“,然后将整个路径放在单引号(”)中,这样就可以工作了。

例子:

假设文件夹名为“Test folder”,位于远程机器的/home/目录中。然后可以使用以下scp命令访问或下载该文件夹。

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

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

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

请注意,IP地址只是示例,最后一个I类型是目录,美元符号是提示符,代码以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)。抱歉我的解释,希望有人能理解,我希望这对需要另一种解决方案的人有帮助。

在linux-terminal或cmd中,如果字与字之间有空格,必须使用引号(")("")标记。

你应该这样做:

$ '/home/tryhackme'

$ /home/tryhackme