从服务器下载文件夹,最直接、最稳妥的命令是scp -r,例如scp -r 用户名@服务器IP:/远程目录 /本地目录,它会递归复制整个文件夹。很多新手习惯用rz或sz,但面对文件夹时往往会卡住,因为sz只能传单个文件,今天这篇内容,咱们就把“从服务器下载文件夹”这件事聊透,从最常规的scp到断点续传的rsync,再到一些特殊场景的处理方案,帮你按需选择。
scp下载整个文件夹:基础但够用
scp(Secure Copy Protocol)基于SSH协议传输数据,安全且无需额外配置,是大多数服务器自带的功能。
scp下载文件夹的标准语法
命令格式如下:
scp -r [选项] 用户名@服务器地址:远程文件夹路径 本地保存路径
举例说明,假设服务器IP是168.1.100,用户名为root,想把服务器上/data/logs/这个目录下载到本地/home/user/backup/:
scp -r root@192.168.1.100:/data/logs /home/user/backup/
执行后会提示输入密码,输入正确密码即开始传输。-r参数是递归(recursive)的缩写,不加它就没法复制目录。
scp下载文件夹的常见选项
-
-P(大写):指定SSH端口,如果服务器SSH端口不是默认的22,比如是2222:scp -r -P 2222 root@192.168.1.100:/data/logs /home/user/backup/
很多人会把
-P写成小写-p,实际小写-p是保留文件修改时间,端口要用大写,这也是报错“连接失败”的常见原因之一。 -
-i:指定私钥文件,用密钥登录时使用:scp -r -i ~/.ssh/id_rsa root@192.168.1.100:/data/logs /home/user/backup/
-
-C:开启压缩传输,对文本类文件(如日志、代码)效果明显,能减少传输量,但对已压缩的文件(如zip、jpg)反而增加CPU开销。
scp下载文件夹的两个常见报错
-
提示
Permission denied (publickey,password)排查顺序:先确认用户名和密码是否正确,再确认SSH端口是否写错(用
-P指定),最后看服务器端/etc/ssh/sshd_config里有没有禁用密码登录。 -
提示
No such file or directory先确认远程路径是否存在,部分服务器出于安全考虑会把用户限制在
/home/用户名目录下,绝对路径要写对,不确定路径时,先通过SSH登录服务器,用ls或pwd确认实际路径再执行。
linux从服务器下载文件夹到本地目录:rsync更适合大文件夹
如果你的需求是linux从服务器下载文件夹到本地目录,且文件夹体积大、文件数量多,或者传输过程中网络不稳定,rsync比scp更靠谱它支持断点续传,且能增量同步。
rsync复制文件夹的基础用法
rsync -avz 用户名@服务器地址:/远程文件夹路径/ 本地保存路径/
这里注意源路径末尾的斜杠:加斜杠表示复制目录内的内容,不加斜杠会把目录本身也复制过来。
rsync -avz root@192.168.1.100:/data/logs/ /home/user/backup/
这会把logs下的所有文件复制到backup/里面;如果想去掉末尾斜杠,则会得到一个backup/logs/的嵌套结构。
rsync断点续传与增量同步
大文件夹传输到一半断开,scp只能重头再来,rsync则支持断点续传,加--partial参数让已传完的部分保留,下次执行时继续:
rsync -avz --partial --progress root@192.168.1.100:/data/logs /home/user/backup/
--progress会显示实时传输速度和进度百分比,方便观察传输状态,对于定期备份的场景,利用rsync的增量特性,第二次同步只会传新增或修改的文件,速度明显更快。
rsync与scp的选择参考
| 对比维度 | scp | rsync |
|---|---|---|
| 断点续传 | 不支持 | 支持 |
| 增量同步 | 不支持 | 支持 |
| 压缩传输 | -C |
-z |
| 适合场景 | 一次性小文件夹 | 大文件夹、多次备份 |
| 加密通道 | SSH | SSH(默认) |
下表是概览:小文件、一次性、临时用scp简单直接,不需要额外安装;大目录、反复传、断网频繁rsync更省心。
其他下载文件夹的方案:zip打包与lrzsz
除了scp和rsync,不同场景下还有其他解法。
先打包再下载:应对海量小文件
如果文件夹里有几十万个图片或日志文件,直接scp -r会为每个文件建立SSH通道,效率极低。行业共识是先在服务器上打成压缩包,再下载单个文件:
tar -zcvf logs.tar.gz /data/logs/ scp root@192.168.1.100:/data/logs.tar.gz /home/user/backup/
打完包之后文件体积大幅缩小,小文件的传输速度问题也得到了缓解,下载后本地解压:
tar -zxvf logs.tar.gz
对于超大目录,可以分卷压缩并配合上面的scp或rsync逐卷下载,避免单文件体积超出磁盘限制。
lrzsz工具:适合内网小文件
lrzsz提供rz(上传)和sz(下载)两个命令,登录服务器后直接执行sz 文件名即可弹出本地保存窗口,但它不支持文件夹递归下载,如果是目录,需要先打包成tar.gz再执行sz,它依赖终端软件的交互支持(如Xshell、SecureCRT),不适合纯命令行环境或自动化脚本,场景上更多是内网临时传几个小配置文件,比如查看nginx配置时顺手下载一份。
linux命令从服务器下载文件夹遇到的权限与端口问题
日常运维中,下载文件夹失败多数集中在这几类问题,这里按出现频率依次排查。
权限不足导致下载失败
远程文件夹没有读权限,或本地目录没有写权限,都会报Permission denied。
远程端排查(SSH登录后执行):
- 当前用户对该目录是否有
r和x权限:ls -ld /data/logs - 目录内文件是否可读:
ls -l /data/logs | head
本地端排查:
- 本地目录是否有写权限,比如下载到
/root/没问题,但下载到/etc/可能就不行了,优先选择一个业务权限范围内的路径,比如/home/用户名/或/tmp/。
SSH端口非默认导致连接不上
很多云服务器出于安全考虑把SSH端口从22改成了其他端口,执行scp时忘记带-P参数,就会连接超时或拒绝连接,用-P指定:
scp -r -P 2222 root@192.168.1.100:/data/logs /home/user/backup/
顺带提一句:rsync如果走SSH通道且端口非22,也需要指定-e参数:
rsync -avz -e "ssh -p 2222" root@192.168.1.100:/data/logs /home/user/backup/
大文件夹传输速度慢的优化思路
既然已经走到了“linux命令怎么从服务器下载文件夹”这一步,速度往往是绕不开的痛点。据统计,多数云服务器下行带宽在1Mbps到10Mbps之间,大文件夹传输慢很多时候是带宽瓶颈。
- 提速首选
rsync配合压缩:-avz开启压缩,高文本比例目录能明显减少传输体积。 - 其次考虑压缩打包:先
tar -zcvf再传,把大量小文件合并为一个流,降低SSH通道的建立开销。 - 如果你的服务器带宽确实小,还可以尝试
rsync --bwlimit限速,避免占满带宽导致其他业务受影响。
更多实用下载命令的补充
排除指定子目录进行下载
scp
没设计排除功能,但rsync支持--exclude:
rsync -avz --exclude 'cache/' --exclude '.tmp' root@服务器:/data/ /本地目录/
这个命令跳过了名为cache的目录和所有.tmp后缀文件,对目录结构复杂的项目非常实用,避免了把垃圾文件一并拉回本地。
Windows环境下载服务器文件夹的命令
如果用的是Windows的PowerShell或CMD,系统不自带scp和rsync,但Windows 10 1803及以上版本内置OpenSSH客户端,直接打开PowerShell执行同样的scp命令即可,语法与Linux一致:
scp -r root@192.168.1.100:/data/logs D:backup
Windows 7或老版本系统,可以安装Git for Windows(自带OpenSSH)或PuTTY的pscp工具,后者语法稍有不同(用小写-r保持一致,但端口参数为-P),不过核心逻辑相同。
常见问题解答
scp下载文件夹和rz下载文件夹有什么区别?
sz是ZMODEM协议,依赖于终端软件的交互窗口,不能直接指定远程路径,也无法递归下载文件夹;scp基于SSH协议,可以在命令行中指定完整路径、支持递归下载,适合自动化脚本和远程批量操作,如果你的目标是Linux服务器之间传输文件夹,scp是标准做法;如果是Windows本机用Xshell连服务器,偶尔拉取一两个文件,sz更顺手。
下载文件夹时终端出现假死或长时间无响应,如何处理?
先按Ctrl+C中断当前任务,如果网络本身没问题,先确认文件夹大小,比如先du -sh /data/logs查看体积;再改用rsync加--partial --progress参数重新下载,利用断点续传跳过已传输的部分,如果是服务器文件数过多(超过几万个小文件),建议先在服务器端打tar包再传输。
如何在本地用一条命令从多个服务器下载文件夹?
写一个简单的循环脚本,把服务器列表和路径按行组织:
for server in user@192.168.1.101 user@192.168.1.102; do scp -r $server:/data/app/config ./configs/$(basename $server)/ done
也可以把所有命令写入一个.sh文件,逐行执行,适合多节点配置备份。权且先记下来,真正需要时直接改IP和路径就能跑。
无论用scp -r还是rsync,核心都是基于SSH的加密传输,选哪一个取决于文件大小、断网风险和增量备份需求,日常小文件夹用scp最省事,大场景优先考虑rsync,如果传输总是不成功,按顺序检查端口、权限、路径这三个变量,大部分问题都能解决。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/680599.html





