Linux服务器日志拷贝到本机,最直接的办法是用scp命令,一条scp 用户名@服务器IP:日志路径 本机目录就能搞定。如果日志文件巨大或者网络不稳定,rsync更适合断点续传,下面从最简单的命令到复杂的生产环境场景,把这几种方案的操作细节和坑都讲透。
先搞懂核心命令:scp基础用法
scp(Secure Copy)是基于SSH协议的安全复制工具,只要你能用SSH登录服务器,就能用它拷日志,命令格式很好记,就是从哪拷到哪:
- 从服务器拷到本机:
scp 用户名@服务器IP:/服务器上的文件路径 /本机保存路径 - 从本机传到服务器:
scp /本机文件路径 用户名@服务器IP:/服务器上的保存路径
举个例子,假设服务器IP是192.168.1.100,用户名是root,日志文件在/var/log/nginx/access.log,想存到本机~/logs/目录下,执行:
scp root@192.168.1.100:/var/log/nginx/access.log ~/logs/
执行后会提示输入root用户的密码,验证通过就开始传输。
复制整个日志目录加个 -r 参数
如果日志不止一个文件,而是按天切割的一整个文件夹,比如/var/log/nginx/下有很多日志,就用递归参数-r:
scp -r root@192.168.1.100:/var/log/nginx/ ~/logs/
改SSH端口用 -P 参数
如果服务器的SSH端口不是默认的22(比如改成了2222),需要加-P指定端口,注意是大写P:
scp -P 2222 root@192.168.1.100:/var/log/nginx/access.log ~/logs/
指定私钥文件用 -i 参数
生产环境很多禁止密码登录,只允许密钥认证,用-i指定私钥文件:
scp -i ~/.ssh/id_rsa root@192.168.1.100:/var/log/nginx/access.log ~/logs/
linux服务器日志拷贝到本机怎么断点续传?用rsync
日常排障时用scp没问题,但日志文件动辄几个GB,网络一抖就断了,还得重新拷,这时候用rsync更靠谱,rsync支持断点续传、增量同步,还能压缩传输。
基础命令:
rsync -avzP root@192.168.1.100:/var/log/nginx/ ~/logs/
参数说明:
-a:归档模式,保留文件属性,递归同步目录-v:显示传输过程-z:传输时压缩,节省带宽-P:等同于--partial --progress,支持断点续传并显示进度
中途断了,重新执行同一条命令,它会跳过已传完的部分,只传剩余数据。
rsync 和 scp 怎么选
| 场景 | scp | rsync |
|---|---|---|
| 单个小文件、临时拷一下 | 推荐,命令短、系统自带 | 没必要,杀鸡用牛刀 |
| 几百MB到几个GB的日志 | 可以但断线要重来 | 推荐,支持断点续传 |
| 定时增量同步 | 不适合 | 推荐,只传差异部分 |
| 目标目录已存在大量文件 | 覆盖或另行处理 | 自动比对,增量更新 |
行业共识认为,rsync的增量特性在同步线上环境日志时,效率和安全性都明显高于scp。
免密rsync的配置方式
如果以后要反复拉取日志,不想每次都输密码,配置SSH密钥对:
- 本机生成密钥对:
ssh-keygen -t rsa -b 4096(一直回车就行) - 拷贝公钥到服务器:
ssh-copy-id root@192.168.1.100 - 之后执行scp或rsync都不再需要密码
用rsync同步时想排除某些文件
比如你只要.log结尾的文件,不要.gz压缩包:
rsync -avzP --include=".log" --exclude=".gz" root@192.168.1.100:/var/log/nginx/ ~/logs/
注意--include和--exclude的顺序不要搞反,include放前面,否则会被exclude全部过滤掉,这是初学rsync比较容易踩的坑。
服务器没有SSH开放端口怎么办?用sz命令绕过
有些公司内网机器出于安全考虑,SSH端口只对跳板机开放,本机直连不上去,如果服务器上还能用终端软件登录(如Xshell、SecureCRT),优先考虑sz命令,这也是linux服务器日志下载到本地常用的一种方式。
先看服务器上装没装lrzsz:
which sz
没装就装一下(需要root权限):
# Debian/Ubuntu apt-get install -y lrzsz # CentOS/RHEL yum install -y lrzsz
然后直接执行:
sz /var/log/nginx/access.log
在弹出的对话框里选个本机保存路径,就开始下载了。
sz命令的优点是简单粗暴,不用管IP和端口,只要终端软件连着服务器就能用,缺点是只能传文件不能传目录,传大文件容易中断且不支持断点续传、不能传文件夹,如果要传文件夹,先把服务器上的日志打包,再sz下载。
打包日志再下载的通用套路
不管用scp还是rsync,如果日志文件特别多、特别碎,先在服务器上打成tar包,传输效率往往更高:
# 在服务器上进入日志目录 cd /var/log/nginx/ # 打包并压缩 tar -czvf access_logs_$(date +%Y%m%d).tar.gz access.log
之后再传这个tar包,传到本地解压即可,文件数量和压缩两个因素都会较大程度影响传输耗时,打包后再传往往更划算。
sz传输大文件中断,试试split切割
sz传超过1GB的文件很容易中途卡死,这时可以用split把大文件切成小块,逐个下载:
split -b 200m /var/log/nginx/access.log access_log_part_
在服务器上生成access_log_part_aa、access_log_part_ab等分片文件,分别下载后本地合并:
cat access_log_part_ > access.log
拷到本机后常见问题:权限、编码、时间同步
日志拷下来了,打不开或者打开乱码的情况也不少。
文件权限不对,本地打不开
服务器上的日志通常权限是root:root且600或640权限,拷贝到本机后归属变成了你的本机用户,一般没问题,但如果你用root身份拷到本机后,普通用户读取有时会遇到Permission denied,解决:
sudo chown 本机用户名:本机用户组 ~/logs/
中文乱码
服务器默认语言是en_US.UTF-8,本机Windows记事本打开常常乱码,解决方法是下载时顺手转换编码,或者用支持UTF-8的编辑器(VS Code、Notepad++)打开。
如果想在Linux本机直接转码:
iconv -f UTF-8 -t GBK access.log > access_gbk.log
日志时间跟本地对不上
服务器常用UTC时间,本机用北京时间(UTC+8),差8小时,查看日志时建议执行:
date
确认服务器时区,如果差8小时就在分析时脑子里加回去,或者直接在服务器上临时把TZ改成本地时区再分析,做日志分析的人通常默认时间差这个细节,排障定位时容易慌乱出错。
用定时任务替代手动拷贝
如果公司要求每天把日志归档一份到本地,手敲命令太容易忘,可以挂个crontab定时任务。
先写一个同步脚本/home/ops/sync_logs.sh:
#!/bin/bash rsync -avzP --delete root@192.168.1.100:/var/log/nginx/ /home/ops/nginx_logs/ >> /var/log/sync_logs.log 2>&1
注意--delete参数含义是让本机目录跟服务器保持完全一致,服务器上删掉的日志本机也会删,如果只是想积累日志,不要加这个参数。
加执行权限:
chmod +x ~/sync_logs.sh
编辑crontab:
crontab -e
加入每天凌晨3点执行:
0 3 /home/ops/sync_logs.sh
断网或服务器只能出不能进的场景用Python临时起HTTP服务
还有一种偏门但好用的方案:服务器装了Python,用Python起一个HTTP服务,本机用wget或浏览器直接下载,这算是没有外网权限环境下sed、awk之外的另一个思路,适合应急。
在服务器日志目录里执行:
cd /var/log/nginx && python3 -m http.server 8888
本机浏览器打开http://服务器IP:8888,或者用wget拉取:
wget http://192.168.1.100:8888/access.log
注意:这个方案没有任何认证加密,内网敏感数据慎用,用完立刻Ctrl+C关掉。
日志文件超大时的传输策略
日志动辄几十GB时,先去服务器上分析,只把结果下载回来,比传输原始日志更现实,比如用grep先筛出某个时间段的报错:
grep "2026-03-11 14:" access.log > error_0311.log
把筛选结果压缩传输,延迟和带宽都能省一步,分析效率反而更高,实际排障中多数情况下先grep再传,比直接搬原始日志快得多。
回到核心建议
- 日常单次拷日志:
scp最简单,优先用 - 日志量大或断网续传:
rsync -avzP是最稳的选择 - 服务器不支持直连但终端能连:
sz命令即可 - 每周自动同步:crontab + rsync脚本
Q&A:linux服务器日志拷贝到本机常见疑问
scp拷贝日志时提示Permission denied怎么办?
先确认服务器端日志文件对当前登录用户有读权限,没有权限就切换到有权限的用户,或者用sudo执行scp:sudo scp root@服务器IP:/var/log/secure ~/logs/,另外检查服务器上目标目录权限问题则要区分清楚是源路径没权限还是本机目标路径没权限。
服务器日志用rsync同步到本机,删掉服务器上的源文件后本机的会不会丢?
不会,rsync默认只增量拷贝,不带--delete参数时不会主动删除本地已有文件,即使带了--delete,也只会在同步执行时删除本机有而服务器没有的多余文件,不影响本地已有文件的完整性,资料来源见rsync官方手册。
怎样确认拷贝过来的日志文件完整无损?
用md5sum在两边分别校验哈希值,服务器上执行md5sum access.log,拷贝完本机再执行md5sum access.log,两次输出的md5字符串一致即传输完好,rsync同步时也可以用-c参数强制校验文件校验和,适合对完整性要求较高的场景。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/773895.html

