
1. 先把丑话说在前面为什么服务器之间传文件会让人头大做运维这些年我发现自己每天打交道最多的动作之一就是在这台服务器和那台服务器之间搬数据。小到拖个配置文件、传个安装包大到同步业务日志、备份数据库文件几乎都绕不开文件传输这件事。你要是只在本地一台机器上折腾拷个U盘或者拖进窗口就行可一旦换成远程Linux服务器事情就没那么“所见即所得”了——没有图形界面、没有剪贴板共享、甚至网络条件还五花八门这时候你手头真正能用得上的其实数来数去就那么几个命令SCP、Rsync、SFTP。网上关于这几个工具的教程一大把但多数是零散的命令堆砌告诉你“敲这个能传文件敲那个能同步目录”却很少讲清楚它们之间的本质区别、各自适合什么场景、踩过哪些坑。结果就是很多新手在一台服务器上试通了SCP换到另一台机器上用Rsync又因为参数不对删错了文件或者配了半天SFTP结果发现连登录都进不去。这篇就是我基于大量实战整理出来的“传文件三件套”完整笔记。不绕弯子直接从命令入手把每一条常用参数的逻辑、每种场景下的选择原因讲透最后再把我实际运维中遇到过的问题和排查思路一并交代清楚。无论你是刚接触Linux的实习生还是已经在生产环境摸爬滚打的运维这几个工具都值得你在手边留一份自己的速查表。2. SCP实战一条命令把文件夹拉下来这是最快上手的方式2.1 SCP的本质是把“拷贝”这件事搬到了网络上SCP全称Secure Copy Protocol说人话就是“基于SSH协议的文件拷贝”。它底层走的是SSH连接所以你传文件的时候不需要额外启动任何服务端程序只要目标机器的SSH服务正常、你有账号密码或者密钥就能直接传。这也是我推荐新手最先掌握SCP的原因学习成本极低本地怎么用cp远程就怎么用scp只不过多写一个“用户名主机地址:路径”。最基本的用法长这样# 把本地文件推送到远程服务器 scp ./backup.tar.gz root192.168.1.10:/data/backup/ # 把远程服务器上的文件拉回本地 scp root192.168.1.10:/data/backup/backup.tar.gz ./这俩方向是整个SCP操作的核心很多人容易记混只要记住“开头不写主机名的就是本地路径开头写了rootIP的就是远程路径”命令是从左往右复制就基本不会弄反。推送就是本地写到远程拉取就是远程写到本地规则非常对称。2.2 传整个文件夹时别忘了 -r 和 -P实际工作中我很少只传单个文件更多时候是把一整个目录带着子目录一起拉下来或者推上去。这时候必须加-r参数表示递归复制。不夸张地说我见过不少同事卡在这一步scp root192.168.1.10:/data/logs ./敲下去直接报错提示Not a regular file其实就是因为没加-r命令根本不知道你要复制的是一个目录。# 递归拉取远程整个目录到本地当前路径 scp -r root192.168.1.10:/data/logs ./logs_backup # 递归推送本地目录到远程服务器 scp -r ./web_dist root192.168.1.10:/var/www/html/这里要特别提醒一个大坑SCP的端口参数是大写的-P而SSH登录用的端口参数是小写的-p。这俩刚好相反初学的朋友十个里有八个在这里踩过雷。如果你的SSH服务不在默认的22端口比如改到了22022那完整命令就是scp -P 22022 -r ./web_dist root192.168.1.10:/var/www/html/大小写搞错的话小写-p在SCP里代表的是“保留文件属性”比如修改时间和访问时间。你要是本来想指定端口却用了小写命令不会报错但文件传过去之后连时间戳都变了排查起来相当隐蔽。2.3 保留文件时间戳、压缩传输和身份验证运维场景里传配置文件或者备份包时源文件和目标文件的修改时间往往是有意义的。比如你按日期组织日志目录每天的日志文件带上mtime如果传输后时间变了后续脚本里按时间判断文件新旧就可能失灵。这时用scp -p就可以保留原始时间戳和权限属性。注意这里的-p是小写因为SCP本身设计上就是这么分配的。还有一个小技巧如果网络带宽不太行而你要传的文件是文本类型、可压缩性很强可以用-C开启压缩传输。SCP会在传输过程中先压缩再传送到目标端自动解压对CPU占用稍微多一点点但能明显节省带宽和时间。我传几个GB的日志文本时实测过开启压缩后总耗时能缩短三分之一左右。# 保留属性和时间戳 scp -p ./app.conf root192.168.1.10:/etc/app/ # 开启压缩传输 scp -C ./access.log root192.168.1.10:/var/log/nginx/另外SCP同样支持用密钥文件登录。如果你有多台服务器、各自用了不同的密钥对可以用-i指定scp -i ~/.ssh/id_rsa_prod ./deploy.sh root192.168.1.10:/opt/还有一个生产环境常用的组合如果SCP过程中不想被交互式地询问“是否确认连接”可以加上-o StrictHostKeyCheckingno。这个选项在第一次连接新主机时特别有用脚本化调用时不会卡在提示符上。2.4 SCP的局限为什么大规模同步时我不推荐它SCP的优点很突出简单、直接、和SSH无缝衔接。但它的缺点同样明显——不支持断点续传也不支持增量同步。什么意思呢假如你要传一个5GB的数据库备份传到4GB时网络断了SCP不会从4GB的位置继续传而是要从头再来一遍。这个感受在生产环境里是非常痛苦的尤其是跨国、跨地域的机房链路网络抖动频繁大文件传一半断掉简直是家常便饭。另外SCP每次都是全量拷贝哪怕你昨天刚传过一个目录今天只改了一个文件SCP也会把整个目录重新传一遍。所以在“反复同步”的场景下SCP的效率非常低。这也是为什么我通常只把SCP用于一次性、小体量的文件传输而一旦涉及重复性同步、备份、目录镜像这类需求就会果断换用Rsync。3. Rsync实战增量同步才是真正的高效利器3.1 它和SCP最大的区别只传差异部分Rsync的全称是Remote Sync它最核心的能力是“增量同步”。简单说它在传输之前会先对比源端和目标端的文件列表然后只传输那些“新增的”或者“发生过变化的”文件块。对于已经相同的文件直接跳过。这个设计思路在日常运维里价值极大因为大多数需要同步的场景都有一个共性——数据变化率很低每天可能只有几个文件在变。我举个例子你就明白了。假设你有一台Web服务器静态资源目录有50GB每天只有几百MB的文件在更新。用SCP每天全量传一遍50GB走完可能要一个多小时还吃满带宽。而用Rsync第一次全量同步后后续每天只需要传那几百MB的差异数据几分钟就搞定。时间上完全是两个数量级。3.2 最常用的Rsync参数组合是怎么来的我平时在命令行里敲得最多的Rsync命令长这样rsync -avz --progress ./web_dist/ root192.168.1.10:/var/www/html/拆开来看各个参数其实各有分工-a是归档模式相当于一组参数的集合包括递归复制、保留符号链接、保留权限、保留属主和属组、保留时间戳等。用上-a基本就覆盖了日常90%的“保留原样”需求。-v是verbose输出详细信息方便你看到哪些文件在传、哪些被跳过。-z是在传输过程中压缩数据和SCP的-C类似专治带宽瓶颈。--progress是显示每个文件传输进度的适合大文件同步时观察状态。注意我刚才在源目录./web_dist/后面加了一个斜杠这个细节非常关键。Rsync的源目录结尾是否带斜杠含义完全不同带斜杠rsync -avz ./web_dist/ roothost:/var/www/html/表示把web_dist目录里面的内容同步到目标目录不会在目标目录下再包一层web_dist。不带斜杠rsync -avz ./web_dist roothost:/var/www/html/表示把web_dist这个目录整体同步过去最终目标端会变成/var/www/html/web_dist/。这个规则在实际操作中经常让人头疼。我自己的习惯是每次写Rsync命令之前先在心里默念一遍“源目录斜杠决定目标目录是否会多套一层”然后把目标路径写完整。 这个细节搞错了同步完目录结构就乱了轻则找不到文件重则影响服务启动路径别问我怎么知道的。3.3 删除同步、排除文件、dry run是绝对不能省的三个操作Rsync真正让我在运维中站稳脚跟的功能是它可以做到“源端和目标端完全一致”。只要加上--deleteRsync就会把目标端存在、但源端已经不存在的文件也一并删除。这通常用于发布代码、同步镜像目录时保证两边文件一模一样不留垃圾文件。# 将本地目录完整镜像到远程多余文件全部删除 rsync -avz --delete ./web_dist/ root192.168.1.10:/var/www/html/等一下这里要非常小心。--delete表面上很省事实际上也很危险因为它是“以源端为准”的删法。如果你源端路径写错了或者源目录为空那目标目录会被清空。所以每次带--delete的命令我都强烈建议先加--dry-run跑一遍看看效果。--dry-run就是预演模式它不会真正执行传输只是在终端上列出“将要执行的操作”。我用这个命令的次数远远高于真正的同步命令rsync -avz --delete --dry-run ./web_dist/ root192.168.1.10:/var/www/html/输出里每个文件前面如果是“deleting”就说明这文件会被删掉检查一下是不是你真的想删的确认无误再去掉--dry-run正式执行。这习惯救过我很多次尤其是有一次我本来想同步/data/project/结果源路径打成了/data/project少了斜杠加上--delete之后预演立刻发现它会把远程目录的整个外层结构都搞乱幸好没有直接执行。另外一个常用参数是--exclude用来排除不需要同步的目录或文件。比如同步网站目录时缓存目录、日志目录通常不想跟着走rsync -avz --delete --excludecache/ --exclude*.log ./web_dist/ root192.168.1.10:/var/www/html/--exclude会按照匹配模式跳过符合条件的文件。这个过滤逻辑用熟了之后同步内容可以非常精准。3.4 结合SSH、限速和断点续传生产环境的标准姿势Rsync本身可以走多种协议但最常见的是走SSH隧道也就是在目标地址后面加上userhost:/path的写法。默认情况下Rsync会直接调用SSH连接所以你不需要额外配置Rsync的服务端只要SSH能用Rsync就能用。# 通过SSH端口22022连接远程主机 rsync -avz -e ssh -p 22022 ./data/ root192.168.1.10:/backup/data/这里-e参数用来指定远程shell我通常会把它拿来指定SSH的密钥和端口。比如管理多个机房的服务器每台用的密钥不一样就可以写成-e ssh -i /root/.ssh/id_rsa_bj -p 22022。配置文件多了以后把不同机器的连接参数存成变量写脚本的时候直接引用非常顺手。还有两个我在同步大目录时一定会用的参数--bwlimit和--partial。--bwlimit2048表示限制传输带宽为2048KB/s即2MB/s这个在业务高峰期同步数据时尤其有用。为什么因为Rsync全速跑起来会瞬间打满网络带宽如果你的服务器上还跑着线上业务用户访问会明显变卡。我会在初始化同步这种重操作时主动限速到对业务没有影响的范围虽然同步时间会拉长但稳定压倒一切。# 限速2MB/s允许断点续传 rsync -avz --bwlimit2048 --partial ./data/ root192.168.1.10:/backup/data/--partial表示如果传输中断保留已经传了一部分的目标文件下次同步时可以在已有基础上继续。这个能力是SCP完全不具备的。配合--progress你可以直观看到传输百分比网络断了也不怕重跑一次命令就能继续。3.5 Rsync做定时备份的一个小脚本模板运维里最常见的一个用法是把Rsync写进crontab做定时备份。这里我贴一个我自己的备份模板你直接改改路径就能用#!/bin/bash # 每天凌晨将本地数据增量同步到远程备份机 SRC/data/mysql_backup/ DESTroot192.168.1.10:/backup/mysql/ LOG/var/log/rsync_backup.log DATE$(date %Y-%m-%d %H:%M:%S) echo [$DATE] backup start $LOG rsync -avz --bwlimit4096 --partial --delete $SRC $DEST $LOG 21 if [ $? -eq 0 ]; then echo [$DATE] backup success $LOG else echo [$DATE] backup failed $LOG fi这个脚本的优点是简单直接配合crontab的0 2 * * * /opt/scripts/mysql_backup.sh就能每天凌晨两点自动执行增量备份。我特别提醒一点 $LOG这个重定向不要省Rsync跑了什么、有没有报错全部记录到日志里以后排查问题全靠它。4. SFTP实战交互式操作和账号隔离的正确打开方式4.1 SFTP不是FTP别被名字骗了SFTP全称SSH File Transfer Protocol虽然名字里带着FTP但和传统FTP完全不是一回事。它同样基于SSH协议不需要单独开放21端口也不需要安装ftpd之类的服务端组件。只要你装了OpenSSH系统里通常就自带SFTP功能了。SFTP最大的优势是交互式操作体验好。你可以像在本地文件管理器里一样用一堆命令浏览远程目录、切路径、批量传文件。对于那种“我一时半会儿也说不清要传哪几个文件先上去看看再决定”的场景SFTP比SCP舒服得多# 登录远程服务器默认22端口 sftp root192.168.1.10 # 登录后可用命令 pwd # 查看远程当前目录 lpwd # 查看本地当前目录 ls # 列出远程目录内容 lls # 列出本地目录内容 cd /data/logs # 切换远程目录 lcd /tmp # 切换本地目录 get access.log # 下载远程文件到本地当前目录 put app.conf # 上传本地文件到远程当前目录这里有个关键规则不带l前缀的命令操作的是远程服务器带l前缀的命令操作的是本地机器。get是从远程拉到本地put是从本地推到远程。方向不要搞错否则就是把文件放错了位置。4.2 批量上传下载mget和mput到底怎么用如果只是想传一两个文件get和put就够了。但你要是想一次拿下一批文件一个一个敲就太蠢了。SFTP提供了批量操作命令# 批量下载远程目录下所有 .log 文件 sftp mget *.log # 批量上传本地所有 .tar.gz 文件 sftp mput *.tar.gz需要注意的是mget和mput批量操作时不会自动递归目录也就是说它只会匹配当前目录下的文件不会进入子目录去继续处理。如果你要递归下载整个目录结构建议使用get -rsftp get -r /data/logs ./logs_backup-r参数会让SFTP递归下载整个目录。同样地put -r可以递归上传整个目录。这算是SFTP里“性能最强”的用法之一基本覆盖了日常批量同步的需求。4.3 CentOS 7上配置SFTP专用账号限制用户只能在特定目录活动生产环境里经常会有这种需求给合作方或者同事开一个账号让他们能传文件但又不想让他们看到服务器上其他任何目录更不能给他们Shell登录权限。这时候就需要SFTP的Chroot功能也就是把用户限制在一个固定目录内。CentOS 7上配置这个并不复杂。首先要编辑SSH配置文件/etc/ssh/sshd_config找到Subsystem sftp这一行默认长这样Subsystem sftp /usr/libexec/openssh/sftp-server把它注释掉换成内置的SFTP服务Subsystem sftp internal-sftp然后在文件末尾追加一段配置专门指定sftp组的规则Match Group sftpusers ChrootDirectory /data/sftp/%u ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no这段配置的意思是属于sftpusers组的用户登录后会被锁进/data/sftp/用户名这个目录里只能在这个目录内用SFTP传文件无法获得Shell也无法转发网络连接。%u是一个占位符会自动替换成当前登录的用户名。接着创建用户和组groupadd sftpusers useradd -g sftpusers -s /sbin/nologin zhangsan passwd zhangsan # 创建用户根目录并设置权限 mkdir -p /data/sftp/zhangsan chown root:root /data/sftp/zhangsan chmod 755 /data/sftp/zhangsan # 创建一个可写的数据子目录 mkdir -p /data/sftp/zhangsan/upload chown zhangsan:sftpusers /data/sftp/zhangsan/upload这里有个非常关键的权限细节ChrootDirectory目录也就是/data/sftp/zhangsan的属主必须是root而且权限不能高于755否则SSH服务会直接拒绝SFTP登录日志里会报Bad owner or permissions。而用户真正想上传文件需要在他自己的目录下再开一个子目录并把子目录的属主改成用户自己。这个“根目录归root、子目录归用户”的结构是SFTP Chroot配置里最常见也最容易出错的地方。改完配置后重启服务systemctl restart sshd然后用zhangsan这个账号测试连接sftp zhangsan192.168.1.10如果你发现登录后只能停留在自己的目录里ls看到的是upload目录其他系统路径一概访问不到那就说明Chroot生效了。4.4 两个常见疑惑Tabby没有SFTP按钮、收到大的SFTP包报错经常有人在群里面问我用Tabby连接SSH之后为什么界面上找不到SFTP按钮其实这和Tabby本身无关。Tabby这类工具的SFTP功能依赖的是SSH连接里的SFTP通道。如果你连接的是普通SSH服务同时系统的sshd_config里没有启用SFTP子系统或者把默认的Subsystem sftp注释掉、替换掉了那么连接建立后工具自然就无法唤起SFTP通道按钮显示不出来。解决办法很简单检查目标服务器的sshd_config确保有一行有效的Subsystem sftp /usr/libexec/openssh/sftp-server或者你自定义的internal-sftp。改完重启sshd后Tabby重新连接SFTP按钮就会出现。如果仍然不出现大概率是端口没配对确认一下你的SSH连接配置里填的端口是不是服务器真实的SSH端口。还有一个经常碰到的报错是“收到的SFTP包太大”或者“Received message too long”。这个问题多半发生在Windows环境下用某些工具连接Linux SFTP时原因是SSH登录时系统返回了一些非协议内容比如/etc/motd或者.bashrc里的echo信息把SFTP握手协议给干扰了。常规解决办法是检查用户的shell配置文件比如~/.bashrc、~/.bash_profile或者/etc/motd把里面那些打印文本语句去掉保持纯静默登录。如果实在无法去除可以把默认shell改成/sbin/nologin之类的非交互shell只保留SFTP能力问题就会消失。5. 三种方案怎么选一张决策表帮你搞定大多数场景5.1 各自的优劣势对比说了这么多很多人最关心的其实是到底该用哪个我的建议是根据任务类型来决定而不是盲目迷信某个工具。下面这张表是我自己工作中反复用的选型对照对比维度SCPRsyncSFTP交互式浏览不支持纯命令式不支持纯命令式支持可交互浏览目录增量同步不支持每次全量支持只传差异部分不支持全量上传/下载断点续传不支持支持加--partial一般工具支持弱看客户端递归目录支持加 -r支持归档模式默认支持get -r / put -r批量操作不支持支持支持 mget/mput保留权限/时间戳支持加 -p支持-a 归档模式部分支持账号权限隔离依赖系统SSH权限依赖系统SSH权限支持Chroot隔离性好适合场景一次性小文件传输定时备份/目录镜像/大目录同步人工交互查目录、受限账号传文件在我日常的运维习惯里SCP用来做一次性快速传输比如临时把一个安装包推到几台机器上或者把某个配置文件拉下来改Rsync用来做一切需要反复执行、自动化的同步和备份SFTP则主要给合作的同事开账号传数据文件或者自己偶尔想上去看看目录再决定传什么。5.2 大目录首次初始化的实战策略如果你要同步一个特别大的目录比如十几个GB甚至上百GB我的习惯是分两步走第一步用Rsync做首次全量同步但加上--bwlimit限速同时用--partial和--progress保证断点可续、状态可见rsync -avz --partial --bwlimit8192 --progress /data/ root192.168.1.10:/data_mirror/第二步首次全量完成后后续的增量同步就变得非常轻量。我会把这个Rsync命令写进crontab让它每天固定时间自动跑一次几分钟就完成。如果中途出现个别文件传输失败Rsync的退出码会告诉你。这里补一句Rsync退出码0表示成功非0的很多数值各有含义比如12表示传输过程中有错误但部分文件已同步24则表示部分文件因为源端消失而没传成。脚本判断成败时别只看return code是0还是非0结合日志分析哪几个文件失败才是正经做法。5.3 安全加固密钥登录永远比密码登录靠谱三种传输方式的安全底子本质上都取决于SSH的安全配置。我见过很多服务器直接开着密码登录、允许root远程登录结果被暴力破解扫得千疮百孔。在配置任何文件传输工具之前先把SSH的安全基线打好才是治本之策。在/etc/ssh/sshd_config里我建议做如下调整# 禁止root直接登录 PermitRootLogin no # 禁止密码登录只允许密钥登录 PasswordAuthentication no PubkeyAuthentication yes # 限制登录的用户 AllowUsers ops zhangsan # 监听端口建议改掉默认22如22022 Port 22022改完记得systemctl restart sshd然后用新规则重新测试连接。这套配置配合密钥对基本可以杜绝大部分暴力破解。 注意顺序先把你的公钥放进服务器的~/.ssh/authorized_keys确认能正常登录再关密码登录否则你可能把自己锁在外面。5.4 锁账号、改端口和检查登录日志除了SSH安全账号本身也要锁好。给合作方开的SFTP账号shell一律用/sbin/nologin然后严格控制目录权限。我见过有的同学图省事直接给合作方开了一个普通bash登录账号等于把服务器整个交出去了这是绝对不可取的。登录日志也是安全管理里很重要的一环。查看最近登录记录last -20 tail -200 /var/log/secure | grep sshd如果发现来源异常的登录IP第一时间踢掉可疑会话# 查看当前所有登录会话 who # 强制杀掉指定用户的所有会话 pkill -u zhangsan允许哪些IP来源可以登录可以用sshd配置里的Match Address做白名单。这样即使密码泄露了非白名单IP也连不进来安全系数会高很多。6. 常见问题与排查技巧实录6.1 服务器之间传文件的十大经典报错整理了我自己踩过以及帮别人排查过的各种问题挑十个最高频的列成速查表你在遇到类似情况时可以直接对照现象可能原因解决思路scp: command not found远程机器没有安装openssh-clientsyum install -y openssh-clientsPermission denied (publickey,password)密钥或密码错误或sshd配置禁用了密码登录检查本机密钥是否加入远程authorized_keys核对账号密码Bad owner or permissionsSFTP Chroot目录属主不是root或权限超755chown root:rootchmod 755Received message too longshell启动时输出多余字符干扰SFTP握手清理.bashrc里的echo文本或改用nologin shellNo such file or directory远程路径写错/目标目录不存在先通过ssh登录验证目录是否真实存在WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED远程主机SSH密钥变化常见于重装系统删除本机known_hosts里对应主机条目重新连接broken pipe网络连接闪断大文件传输中断改用Rsync加--partial断点续传Sftp subsystem request failedsshd_config里Subsystem sftp配置被注释或路径错误恢复Subsystem配置重启sshddirectory not empty目标目录有非空文件Rsync删除顺序问题确认--delete用法必要时手动清理后再同步mv: cannot move ... Device or resource busy目标文件正在被进程占用lsof确认占用进程先停服务再替换文件6.2 一个实战案例Rsync同步大目录总是传不完怎么办有一次我在两台机房服务器之间同步一个接近200GB的素材目录第一次同步跑了将近三个小时眼看快结束了网络一抖动整个任务报废。当时我还没有用--partial所以只能从头再来极其痛苦。后来我总结经验大目录的Rsync任务一定要采取“分而治之”的思路。我的做法是这样的第一步把源目录分成几块按内容类型拆开。比如图片目录、视频目录、配置文件目录各建一个Rsync任务脚本里依次执行。这样即使某一小块中断了其他小块不受影响。第二步每个小块都用下面的参数组合保证断点可续rsync -avz --partial --bwlimit6144 --timeout300 /data/images root192.168.1.10:/data_mirror/images/--timeout300会在网络无响应300秒后主动断掉避免卡在一个死连接上耗费时间配合--partial可以在下轮同步时接着传。然后我把这个命令放进循环加上--delete用于增量清理保证目标端始终是源端的完整镜像。第三步每次同步完查看退出码和日志。如果有失败文件单独生成一个列表下次同步前针对性处理。这样一套流程走下来再大的目录也能在可控时间内完成而不是一遍又一遍地从头开始。6.3 密码过期提醒通知的处理还有一个运维里很容易被忽略的问题系统账号密码过期。如果你给合作方开的SFTP账号密码到期了他那边连接时可能直接提示密码过期无法登录你还以为是配置或网络出了问题。Linux里查看密码过期信息用chage -l zhangsan如果不想让密码过期可以直接设置密码永不过期chage -M 99999 zhangsan涉及到批量账号管理时我一般在创建账号时就顺手把密码策略写清楚并且把过期提醒通知脚本加到crontab每周检查一次哪些账号快到期了提前通知当事人改密码。这样既安全又不会突然断掉对方的访问。最后的经验之谈我个人在实际操作中体会最深的一点是文件传输这件事工具从来不是问题问题出在两个地方——一是路径搞错二是同步策略没想清楚。SCP、Rsync、SFTP它们三个本质上是互补关系而不是互相替代的关系。你不需要纠结哪个“最强”而是应该建立一套自己的习惯小文件临时传用SCP重复性目录同步和备份用Rsync需要给人开受限账号或者交互式浏览目录时用SFTP。另外再分享一个小技巧如果你经常在多个服务器之间来回传文件可以在~/.ssh/config里给常用主机起个别名比如Host bj-web HostName 192.168.1.10 Port 22022 User root IdentityFile ~/.ssh/id_rsa_bj配置好之后SCP命令可以写成scp ./a.tar.gz bj-web:/data/Rsync可以写成rsync -avz ./data/ bj-web:/backup/SFTP直接sftp bj-web。这比每次把完整的用户名、IP、端口敲一遍省太多事了。尤其当你手头管理着几十台服务器时这个配置文件能让你的操作效率直接翻倍。文件传输看起来是运维里最基础的一环但恰恰是这些基础环节的顺手程度决定了你每天处理杂事的速度。把这几个工具用熟、用对省下来的时间足够你去处理更复杂的架构问题。