如何使用scp将文件夹从远程复制到本地主机?
我使用ssh登录我的服务器。然后,我想把远程文件夹foo复制到本地/home/user/Desktop。
如何做到这一点?
- 操作的问题是,当ssh连接到远程主机时,是否可以将文件从远程主机复制到本地主机。我不知道为什么没有一个答案能正确回答他/她的问题。
- 请参阅meta.stackoverflow.com/questions/294217/…。问题还在这里,你也可以投票。它只是不允许有更多的答案。
- 这个问题的前提是不正确的。其思想是,一旦登录到ssh,如何将文件从登录的机器移回登录的客户机。但是,SCP不知道也不能使用ssh连接。它正在建立自己的联系。因此,简单的解决方案是在本地工作站上创建一个新的终端窗口,并运行SCP,将文件从远程服务器传输到本地计算机。例如,scp-i key user@remote:/remote dir/remote file/local dir/local file
- 这个问题可能是个话题外的话题,但它也是谷歌排名最高的帖子。锁定意味着没有人可以更新它来提供更好的解决方案。
- 使用mc:TAB、cd sh://USER@HOST,使用mc快捷键,完成后cd退出。
- 我最近问了一个类似的"稍微深入"的问题,关于另一个超级用户工具的命令行,它被那里的mods移动到stackoverflow。不管怎样,我同意mods的观点:我们能把它转移到超级用户,请把它解锁,并有更多的答案进来吗?
来自man scp(见在线手册)
-r Recursively copy entire directories
- 我每次都用谷歌搜索这个。相关漫画:xkcd.com/1168
- @gryphius使用时,我继续收到一个拒绝权限(publickey)错误。我如何解决这个问题?
- @John-K,许多可能的原因(服务器上未启用SCP、公钥未授权、文件权限问题…)。首先检查标准ssh是否与您的密钥一起工作。请参考SOF/ServerFault上关于该主题的现有问题,如果没有帮助,请使用ssh/scp的调试输出在ServerFault上询问新问题。
- 您必须在两台计算机上都设置RSA密钥-您可能还必须在本地计算机上运行ssh-add。
- 我发现了两个很好的消息:-C标志增加了压缩,-C标志允许您传入其他密码类型以获得更好的性能,如dimuthu答案中所示的scp -c blowfish a@b:something .。
- scp -r [email protected]:/path/to/foo/. /home/user/Desktop/foo始终复制和替换
- 使用-p保存文件修改时间、权限等!scp-pr用户@…
- 这个答案缺乏重要的解释。你最终会和Desktop/foo一起结束还是会让Desktop/allcontentsofFooGohereSCP看起来很奇怪,有时对我来说,它会做一件接着一件的事情
- 例如(通常用于shell脚本):su myuser -c"scp -r /var/www/myapp.org/uploads root@$jcrdevip:/var/www/mydevapp.com/uploads"将内容从上载复制到上载。scp -r /var/www/myapp.org/uploads root@$jcrdevip:/var/www/mydevapp.com/uploads似乎将文件夹上载复制到mydevapp.com/uploads文件夹中,从而创建不需要的子文件夹。
- @Toskan和scp -r [email protected]:/path/to/foo /home/user/Desktop/你应该以Desktop/foo结束。在scp -r [email protected]:/path/to/foo/. /home/user/Desktop/中,你将得到Desktop中foo的内容,以及Desktop中散布的foo的所有子目录。
要使用SCP的全部功能,您需要执行以下步骤:
公钥授权
创建ssh别名
然后,例如,如果您有这个~/.ssh/config:
1 2 3 4 5 6 7 8 9
| Host test
User testuser
HostName test-site.com
Port 22022
Host prod
User produser
HostName production-site.com
Port 22022 |
您将从密码输入中保存自己并简化SCP语法,如下所示:
1 2
| 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 |
此外,您还可以使用远程路径完成:
1 2
| scp test:/var/log/ # press tab twice
Display all 151 possibilities? (y or n) |
更新:
要启用远程bash完成,您需要在和主机上都有bash shell,并正确地工作bash完成。有关更多信息,请参阅相关问题:
如何在使用SCP时为远程路径启用自动完成功能?SCP文件名选项卡完成
- 不知道配置文件,这太棒了!
- 标签完成是胡说,只是完成从本地主机为我。
- @B.long问题是"如何将远程文件夹foo复制到本地桌面"。我的答案是"scp-r prod:/path/foo/home/user/desktop"。希望你能看到关系。
- @Bernhard远程选项卡完成是一个众所周知的过程。这对你来说是胡说八道:)
- @可能是Alexanderyancharuk,但您的答案对我来说并不是这样,所以您的答案至少限于本地和/或主机上的某些版本。
- @Bernhard对我来说很明显,因为我使用的是bash shell。谢谢你指点我!回答更新。
- 我的错误是@alexanderyancharuk,我以为你是在暗示OP(@slasengger)需要修改他的~/.ssh/config才能复制文件夹(这是不正确的)。现在我明白了,你正试图用无密码的ssh给他额外的便利。
- @Alexander Yancharuk:感谢您的回答,这比只介绍语法更详细。
- 您还可以使用类似storm的工具来自动化向.ssh/config添加服务器的过程。
- 真的。。远程路径完成的关键点。我不知道。
将所有内容从本地位置复制到远程位置(上载)
1
| scp -r /path/from/destination username@hostname:/path/to/destination |
将所有内容从远程位置复制到本地位置(下载)
1
| scp -r username@hostname:/path/from/destination /path/to/destination |
自定义端口,其中xxxx是自定义端口号
1
| scp -r -P xxxx username@hostname:/path/from/destination /path/to/destination |
在当前目录上从远程复制到本地
1
| scp -r username@hostname:/path/from/file . |
帮助:
-r递归复制所有目录和文件
始终使用来自/的完整位置,由pwd获取完整位置。
scp将替换所有现有文件
hostname将是主机名或IP地址。
如果需要自定义端口(除了端口22),使用-P portnumber。
. (dot)-它是指当前的工作目录,所以只能从服务器下载/复制并粘贴到这里。
注意:有时由于防火墙中不允许使用该端口,自定义端口将无法工作,因此请确保防火墙中允许使用自定义端口进行传入和传出连接。
- 看起来(至少在RaspbianJessie和Ubuntu的最新版本中)scp使用-p(大写p)作为端口,而(奇怪的是)ssh使用-p(小写)。
- @阿丹普勒,你是对的,但大致上我总是用-p(小):)
- -p用于保存"修改时间、访问时间和原始文件中的模式"。因此,如果您将它用于端口,那么它可能不起作用;-),除非您有一个不同的版本,以不同的方式使用小写字母P。
- 对于ssh,是的。不适用于SCP(我想)。
- 如果目录包含空格,我应该放什么?
- @hyprcrcb使用pwd获取位置并使用相同的位置
- _port_可能指当地?如果两个端口都不同怎么办?
- @Timo没关系,因为您将在ssh登录后执行scp。
- @但是如果我远程到本地,我就不会登录。
我经常使用的是:
1
| scp -r username@IP:/path/to/server/source/folder/ . |
. (dot):表示current folder。所以从服务器复制并粘贴到这里。
IP:可以是像125.55.41.311这样的IP地址,也可以是像ns1.mysite.com那样的主机。
最好先压缩远程服务器上的目录:
1
| tar czfP backup.tar.gz /path/to/catalog |
其次,从远程下载:
最后,提取文件:
- "更好"在很大程度上取决于您传输的数据以及ssh到服务器进行压缩/解压的工作。并且:您可以使用-C标志向scp添加压缩,比如scp -C a@b:bigfile .。
- 这让我想起了@cptloop的评论!:d xkcd.com/1168
如果您有一个地狱般的文件要从远程位置下载,如果您不太关心安全性,请尝试将SCP默认加密(三重DES)更改为类似"Blowfish"。
这将大大减少文件复制时间。
- 根据这篇博客文章,你可以用arcfour代替blowfish,获得更好的性能,但是它有安全缺陷。
转到Unity工具栏上的文件
按ctrl+l在这里写下"你的用户"[email protected]
192.168.1.103是要连接的主机。
这里有一个例子
典型场景,
1
| scp -r -P port username@ip:/path-to-folder . |
用样本解释,
scp -r -P 27000 [email protected]:/tmp/hotel_dump .
在哪里?
1 2 3 4
| port = 27000
username ="abc" , remote server username
path-to-folder = tmp/hotel_dump
. = current local directory |
如果遇到"太多身份验证失败",请指定已添加到服务器ssh服务器的确切ssh密钥:
1
| scp -r -i /path/to/local/key [email protected]:/path/to/folder /your/local/target/dir |
问题是如何使用scp命令将文件夹从远程复制到本地。
$ scp -r userRemote@remoteIp:/path/remoteDir /path/localDir
但是,这里有更好的方法来使用sftp–ssh文件传输协议(也称为安全文件传输协议,或sftp)是一种网络协议,它提供文件访问、文件传输和任何可靠数据流上的文件管理(维基百科)。
$ sftp user_remote@remote_ip
sftp> cd /path/to/remoteDir
sftp> get -r remoteDir
Fetching /path/to/remoteDir to localDir 100% 398 0.4KB/s 00:00
要获得有关sftp命令的帮助,只需键入help或?。
我不知道为什么,但我必须在源服务器指令之前使用本地文件夹。使它工作
- 假设用户有权限,您可以在不使用root@的情况下执行绝对路径吗?