linux把本地文件拷贝到服务器上,最直接的方式是使用scp命令,它基于ssh加密传输,一条命令就能完成整个拷贝流程。 下面我会从命令用法、传输场景、常见坑三个层面展开,顺便聊聊rsync和sftp的区别,帮你彻底搞定linux和服务器之间的文件传输。
linux怎么把本地文件拷贝到服务器上?scp命令实操
scp是linux系统里自带的远程拷贝工具,只要服务器开了ssh服务,就能直接使用,它的语法和cp命令很像,区别在于目标地址要写成“用户名@服务器IP:路径”的格式。
scp拷贝单个文件
假设你要把当前目录下的backup.tar.gz传到服务器168.1.100的/root/backup目录下,用户名是root,命令是这样:
scp backup.tar.gz root@192.168.1.100:/root/backup/
回车后输入服务器密码,等待进度条走完,文件就过去了,注意目标路径最后带不带,如果带斜杠表示是目录,不带斜杠则会把文件重命名成那个名字。
scp拷贝整个目录
如果需要传送的是一个文件夹,比如/home/user/logs整个目录,得加-r参数:
scp -r /home/user/logs root@192.168.1.100:/data/logs/
-r表示递归复制,不加这个参数,scp会报错,告诉你目标不是普通文件。
指定端口拷贝
很多服务器为了安全,把ssh端口改成了非22,比如端口是2222,那么用-P参数指定:
scp -P 2222 file.tar.gz root@192.168.1.100:/root/
这里是大写P,和ssh命令的小写p不一样,别记混,如果你忘了指定端口,scp会默认走22,然后连接被拒绝。
限速与保留文件属性
传输大文件时,可以用-l参数限制带宽,单位是Kbit/s:
scp -l 1000 bigfile.iso root@192.168.1.100:/data/
这条命令把传输速度限制在1Mbps左右,避免占满带宽影响线上服务,加上-p参数可以保留文件的修改时间和权限属性,适合备份场景。
linux本地文件拷贝到服务器命令对比:scp、rsync、sftp怎么选
很多人在linux下拷文件会纠结,到底用scp、rsync还是sftp,我直接说结论:传少量小文件用scp最简单,传大量文件或需要增量同步用rsync,想交互式查看服务器目录再上传用sftp。 这三者都基于ssh协议,安全性一样。
scp适合一次性传输
scp的优点是命令短、上手快,不需要额外配置,缺点是如果传输中断,下次得从头传,而且scp不支持增量同步,每次都是完整覆盖。
rsync适合大批量同步
rsync是linux下的同步神器,它支持断点续传、增量同步、压缩传输,比如把本地/home/user/www同步到服务器,可以先删掉目标端多余文件:
rsync -avz --delete /home/user/www/ root@192.168.1.100:/var/www/
参数-a是归档模式,保留权限、时间戳等;-v显示过程;-z传输时压缩。--delete会让目标目录里本地没有的文件被删掉,让两边完全一致。
如果中途断网,重新执行一遍相同命令,rsync只会传没传完的部分,这是scp做不到的。
sftp适合手动管理
sftp是交互式工具,登录后可以用put上传、get下载,还能用ls、cd查看服务器目录,适合你不太确定服务器路径,想先看看再传的场景,登录命令:
sftp root@192.168.1.100
登录后本地目录用lcd切换,服务器目录用cd切换,上传执行put localfile,下载执行get remotefile,如果你用惯了Windows下的WinSCP,sftp的操作思路是一样的。
linux怎么传文件到服务器?rsync增量同步实操
rsync除了在命令行里用,还能配合cron做定时同步,我平时最常用的一个场景是:本地开发机改完代码,用rsync把变动的文件推到测试服务器。
先做一次完整同步
第一次使用时,目录可能很大,直接执行:
rsync -avz --progress /home/user/project/ root@192.168.1.100:/home/project/
--progress会显示每个文件的进度,如果文件很多,可以加--exclude忽略不需要的目录,
rsync -avz --exclude "node_modules" --exclude ".git" /home/user/project/ root@192.168.1.100:/home/project/
这样同步速度会快很多,也避免把本地依赖包传到服务器上。
增量同步只传差异部分
第二次执行相同命令,rsync会对比文件大小和修改时间,只传输有变化的文件,如果文件内容变了但大小和时间没变,需要加--checksum强制校验内容:
rsync -avzc /home/user/project/ root@192.168.1.100:/home/project/
-c会逐一计算文件校验值,更准确但更耗CPU,大多数场景下-avz已经够用。
断点续传
传一半断了,重新执行原命令即可,如果rsync版本较老,可以加--partial保留部分传输的文件,后续同步能接着传,新版rsync默认行为已经能处理,但加这个参数更保险。
拷贝文件时常见的3个坑
你以为拷贝命令记住了就完事?实际操作中,下面这几个坑我几乎每次都会遇到。
目录权限导致失败
服务器上的目标目录如果属于其他用户,而你用普通账号登录,scp会报Permission denied,解决方法是先切到root或使用sudo修改目录权限,或者直接传到自己有权限的目录,再在服务器上用mv移动。
路径里有空格或特殊字符
本地文件名包含空格,比如my file.tar.gz,必须用引号包裹:
scp "my file.tar.gz" root@192.168.1.100:/root/
如果不加引号,scp会把它当成两个文件去解析,立刻报错。
防火墙挡了22端口
有时候scp命令卡住不动,然后报Connection timed out,多数情况下是服务器防火墙拦了22端口,或者安全组没放行,先在本机测试telnet 192.168.1.100 22,如果不通,去服务器防火墙放行端口:
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload
如果是云服务器,还要在云控制台的安全组规则里允许TCP 22入方向。
行业共识认为,linux和服务器之间的文件传输,绝大多数工作都能用scp和rsync覆盖,没必要再装额外软件。
如何免密拷贝文件?
每次输密码太烦,特别是脚本里自动同步时根本没法交互输密码,解决办法是配置ssh密钥对。
生成密钥并上传
在本地执行:
ssh-keygen -t rsa -b 4096
一路回车,生成公钥和私钥,然后把公钥内容追加到服务器的~/.ssh/authorized_keys文件里,一条命令搞定:
ssh-copy-id root@192.168.1.100
之后再用scp或rsync,就不再需要输入密码了。
密钥权限别忽略
配置好密钥后依然免密失败,先检查两个权限,本地私钥~/.ssh/id_rsa权限必须是600,服务器.ssh目录权限必须是700,authorized_keys权限是600,权限不对,ssh会直接跳过密钥认证,改为密码认证,但非交互模式下又没法输密码,就会失败。
linux文件拷贝到服务器的Q&A
linux怎么把本地文件拷贝到服务器上?scp命令提示找不到文件怎么解决?
先确认本地文件路径是否正确,执行ls -l看看文件是否存在,如果文件存在,再看路径中是否包含通配符或空格,Shell会把它们展开,还有一种情况,文件名以开头,scp会把它当成参数,这时在路径前加,比如scp ./-filename.tar.gz root@服务器:/root/。
rsync和scp哪个更快?
分场景,传单个大文件,两者速度和带宽上限接近,传大量小文件时,rsync因为能增量同步,通常比scp效率更高,特别是第二次传输时只传差异部分,速度优势明显,行业共识是,日常同步用rsync,简单拷贝用scp。
从服务器下载文件到本地,命令有什么不同?
方向反过来而已,scp下载用scp root@服务器:/远程路径/文件名 /本地路径/,rsync下载用rsync -avz root@服务器:/远程目录/ /本地目录/,关键是把源地址改成服务器,目标地址改成本地,参数基本不变。
linux把本地文件拷贝到服务器上,核心就是scp和rsync这两个命令,一个简单直接,一个适合增量同步。 按你的文件量和是否重复传输来选,小文件用scp,大目录或定时同步用rsync,基本能覆盖所有日常场景。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/765291.html





