我该如何使用scp将远程文件夹复制到本地?

3386

我如何使用 scp 将远程文件夹复制到本地主机?

我使用 ssh 登录到我的服务器。
然后,我想将远程文件夹 foo 复制到本地路径 /home/user/Desktop

我应该如何操作?


105
OP的问题是在通过ssh连接到远程主机时是否可以将文件从远程主机复制到本地主机。我不确定为什么没有一个答案正确回答了他/她的问题。 - JeffDror
15
问题的前提是错误的。问题本意是,一旦登录到SSH,如何将文件从已登录机器移回到已登录的客户端。然而,SCP不知道也不能使用SSH连接。它会建立自己的连接。因此,简单的解决方法是在本地工作站上创建一个新的终端窗口,并运行SCP将文件从远程服务器传输到本地机器。例如,scp -i key user@remote:/remote-dir/remote-file /local-dir/local-file - jeffmcneill
1
使用 mc:按下 TAB 键,输入 cd sh://USER@HOST,使用 mc 快捷键,完成后输入 cd 退出。 - sjas
1
@sjas:在 mc 中,使用菜单上的 左/右 更容易,进入 Shell 链接,您可以在其中输入您在 ~/.ssh/config 中拥有的别名,例如 myhost: > 确定 - ccpizza
2
@jeffmcneill 是的,你说得对。但是你没有直接回答JeffDror,所以我猜大多数人没有意识到你在回答JeffDror的问题。 - Adam
14个回答

6072
scp -r user@your.server.example.com:/path/to/foo /home/user/Desktop/

如果在foo路径末尾不包含'/'符号,你将复制整个目录(包括内容),而不仅仅是目录的内容。

man scp (参见在线手册)

-r 递归复制整个目录


1924
我每次都要谷歌搜索这个。相关漫画:https://xkcd.com/1168/。 - cptloop
18
我找到了两个有用的信息:使用-C选项可以进行压缩,使用-c选项可以传递其他加密类型以获得更好的性能,例如scp -c blowfish a@b:something . 参见dimuthu的回答 - Automatico
109
使用“-p”选项以保留文件的修改时间、权限等信息!scp -pr user@... - Ber
35
这个答案缺少重要的解释。你会得到 Desktop/foo 还是 Desktop/Foo文件夹中的所有内容?有时候scp的行为看起来很奇怪,它做一件事,然后又做另一件事。 - Toskan
19
使用命令scp -r user@your.server.example.com:/path/to/foo /home/user/Desktop/,你会得到Desktop/foo。使用命令scp -r user@your.server.example.com:/path/to/foo/. /home/user/Desktop/,你会得到Desktop中foo文件夹下的所有内容和子目录。 - Ioannis
显示剩余11条评论

363

要充分利用scp的功能,您需要按照以下步骤进行操作:

  1. 公钥授权
  2. 创建SSH别名

然后,例如,如果您有这个~/.ssh/config文件:

Host test
    User testuser
    HostName test-site.example
    Port 22022

Host prod
    User produser
    HostName production-site.example
    Port 22022

您可以通过这种方式免去输入密码并使scp语法更加简化:

scp -r prod:/path/foo /home/user/Desktop   # copy to local
scp -r prod:/path/foo test:/tmp            # copy from remote prod to remote test

此外,您还将能够使用远程路径补全功能:

scp test:/var/log/  # press tab twice
Display all 151 possibilities? (y or n)

为了启用远程bash命令补全,您需要在<源><目标>主机上都安装bash-shell,并确保bash-completion正常工作。有关更多信息,请参见相关问题:

如何在使用scp时启用远程路径的自动补全?
SCP文件名选项卡补全


15
没想到还有配置文件,太棒了! - dmastylo
Tab键自动补全是无意义的,它只会从本地主机进行补全。 - Bernhard
16
问题是“如何将远程文件夹foo复制到本地桌面”,我的回答是“scp -r prod:/path/foo /home/user/Desktop”。希望你能看得懂。 - Alexander Yancharuk
2
@Bernhard 对我来说很明显,因为我使用的是bash-shell。谢谢你指出这一点!回答已更新。 - Alexander Yancharuk
1
@Alexander Yancharuk:感谢您的答复,这比仅仅涵盖语法更为详细。 - Gladiator
显示剩余4条评论

352

将所有内容从本地位置复制到远程位置(上传)

scp -r /path/from/local username@hostname:/path/to/remote

将所有内容从远程位置复制到本地位置(下载)

scp -r username@hostname:/path/from/remote /path/to/local

自定义端口,其中xxxx自定义端口号码

 scp -r -P xxxx username@hostname:/path/from/remote /path/to/local

远程本地拷贝至当前目录

scp -r username@hostname:/path/from/remote .

帮助:

  1. -r:递归复制所有目录和文件。
  2. 始终使用来自/的完整位置,通过pwd获取完整位置/路径。
  3. scp将替换所有现有文件。
  4. hostname将是主机名或IP地址。
  5. 如果需要自定义端口(除了端口22),请使用-P端口号
  6. .(点)——它表示当前工作目录,因此只需从服务器下载/复制并粘贴到此处即可。

注意:有时防火墙不允许自定义端口,导致自定义端口无法使用。因此,请确保在防火墙中允许自定义端口进行入站和出站连接。


1
在最近的Raspbian Jessie和Ubuntu版本中,似乎scp使用大写P的-P参数来指定端口,而ssh则使用小写p的-p参数(奇怪的是)。 - Adam Plocher
1
“-p” 保留了“原始文件的修改时间、访问时间和模式”的信息。所以,如果你正在使用它进行端口传输,那么它可能不起作用;除非你使用的是另一种将小写字母 p 用于不同目的的版本。 - Adam Plocher
如果目录名包含空格,我应该输入什么? - Brethlosze
请使用 pwd 命令获取当前路径并在同一位置操作。 - Shiv Singh
尽管这个答案已经很详细了,但仍然不清楚目标文件是被复制到另一个文件夹目标中,还是整个文件夹目标。如果你执行scp -r .../source .../target,那么结果将是.../target/source,而如果你执行scp -r .../source/* .../target,那么.../target将包含源文件的文件。 - Robin Manoli
显示剩余4条评论

79

我一直使用的是:

scp -r username@IP:/path/to/server/source/folder/  .

. (点):表示当前文件夹。因此只需从服务器复制并粘贴到此处。

IP:可以是像125.55.41.311这样的IP地址,也可以是主机名,例如ns1.mysite.example


10
感谢您指出 . 代表当前目录! - ericmjl

45

最好先在远程服务器上压缩目录:

tar czfP backup.tar.gz /path/to/catalog

其次,从远程下载:

scp user@your.server.example.com:/path/to/backup.tar.gz .

最后,提取文件:

tar -xzvf backup.tar.gz

13
“更好”很大程度上取决于您要传输的数据以及通过ssh连接到服务器进行压缩/解压所需的努力。另外,您可以使用“-C”标志将压缩功能添加到scp命令中,例如:scp -C a@b:bigfile . - Automatico
5
这让我想起@cptloop的评论!: D https://xkcd.com/1168/ - GoodSp33d
2
你帮我省去了一次额外的谷歌搜索。 - Lucio Mollinedo

24

典型场景,

scp -r -P port username@ip:/path-to-folder  .

使用示例进行解释:

scp -r -P 27000 abc@10.70.12.12:/tmp/hotel_dump .

其中,

port = 27000
username = "abc" , remote server username
path-to-folder = tmp/hotel_dump
. = current local directory

1
感谢您的回答。对于我来说,指定SSH端口-P非常有帮助。 - redoff

23

如果你需要从远程位置下载大量文件,并且不太关心安全问题,那么尝试将scp的默认加密方式(Triple-DES)更改为'blowfish'之类的加密方式。

这将大大缩短文件复制时间。

scp -c blowfish -r user@your.server.example.com:/path/to/foo /home/user/Desktop/

2
根据这篇博客文章,使用arcfour可以获得比blowfish更好的性能,但是它存在安全漏洞。 - Automatico

21

进入Unity工具栏上的“文件”。

输入图像描述

按Ctrl + l并在此处写下_your_user_name@192.168.10.123

192.168.1.103是您要连接的主机。

这里是一个示例。

输入图像描述


完全离题。被踩是因为它采用了次优和过于具体的方法,这种方法甚至不能回答问题,从而稀释了相关答案。 - Valentin Waeselynck

16

如果您遇到“Too many authentication failures”错误,请指定您添加到服务器ssh服务器的确切SSH密钥:

scp -r -i /path/to/local/key user@remote.tld:/path/to/folder /your/local/target/dir

15
问题是如何使用scp命令将远程文件夹复制到本地。

$ scp -r userRemote@remoteIp:/path/remoteDir /path/localDir

但这里有更好的方法,可以使用sftp进行操作 - SSH文件传输协议(也称安全文件传输协议或SFTP)是一种网络协议,可在任何可靠数据流上提供文件访问、文件传输和文件管理。(wikipedia).

$ sftp user_remote@remote_ip

sftp> cd /path/to/remoteDir

sftp> get -r remoteDir

从/path/to/remoteDir获取到localDir 100% 398 0.4KB/s 00:00

要了解有关sftp命令的帮助,请键入help?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接