Linux scp远程传输教程:从本地上传到服务器下载
scp 是 Linux 自带的远程文件传输命令,它走 SSH 通道,只要你能用 ssh 登录服务器,基本就能直接用 scp 传文件,不需要额外装服务端。
它适合的场景很明确:本地和服务器之间偶尔传几个文件、传一个项目目录、从服务器拉一份日志下来。
如果你需要频繁同步大量文件,rsync 会更合适,但日常小规模传输,scp 足够用。
用之前先确认两件事
第一,本地机器要能正常 ssh 登录目标服务器,说明网络、端口、账号密码或密钥都是通的。
第二,确认你要传的文件路径和目标目录路径,路径写错是新手最常见的问题。
scp 的基本格式是:
scp [参数] 源路径 目标路径
远程路径的写法固定为 用户名@服务器IP:路径,例如 root@192.168.1.10:/www/wwwroot/。
冒号前面是登录信息,冒号后面是服务器上的路径。
上传和下载的具体命令
本地文件上传到服务器,在本地终端执行:
scp /home/user/app.tar.gz root@192.168.1.10:/www/wwwroot/
执行后会提示输入服务器密码,输入时屏幕不显示字符是正常的,输完回车即可。
从服务器下载文件到本地,把源和目标调换位置:
scp root@192.168.1.10:/var/log/nginx/access.log ./logs/
传整个目录必须加 -r 参数,否则会报错:
scp -r /home/user/myproject root@192.168.1.10:/www/wwwroot/
如果服务器 SSH 端口不是默认的 22,用 -P 指定端口(注意是大写 P):
scp -P 2222 app.tar.gz root@192.168.1.10:/www/wwwroot/
用密钥登录时加 -i 指定私钥文件:
scp -i ~/.ssh/id_rsa app.tar.gz root@192.168.1.10:/www/wwwroot/
容易踩的坑
报 Permission denied:说明登录成功但目标目录没写权限。
用 ls -ld /目标目录 看一下属主和权限,常见做法是先传到有权限的家目录,再用 sudo mv 移动到目标位置,不要直接给整个目录 777 权限。
报 No such file or directory:多半是路径写错,或者目标目录在服务器上不存在。
scp 不会自动创建不存在的目录,先 ssh 上去 mkdir -p 建好再传。
目录传输报 not a regular file:忘了加 -r,补上即可。
传输卡住不动:检查服务器防火墙和云安全组是否放行了 SSH 端口,-v 参数可以打印详细连接过程,方便定位卡在哪一步。
传大文件中途断线:scp 不支持断点续传,中断后需要重新传。
这类场景建议改用 rsync,它支持续传和增量同步。
怎么确认传成功了
传输结束后,登录服务器执行 ls -lh /目标目录,对比文件大小和修改时间。
大文件还可以用 md5sum 文件名 在本地和服务器各算一次,两个值一致说明文件完整。
目录传输则用 du -sh 目录名 看总大小是否接近。
常见疑问
scp 和 sftp 有什么区别? 两者都基于 SSH,scp 更适合一条命令直接搞定传输,sftp 是交互式会话,适合边浏览边传,脚本化场景用 scp 更顺手。
需要先装什么软件吗? 大多数 Linux 和 macOS 自带 scp,Windows 10 以上可在 PowerShell 中直接使用,前提是本地有 SSH 客户端。
传输时能看进度吗? 默认不显示进度,加 -v 可以看到详细的连接和传输信息,但输出较啰嗦,日常传输不加也行。
最后收一下重点,scp 的核心就是记牢“源在前、目标在后”和“远程路径带冒号”这两个规则,剩下的参数按需加,遇到报错先看路径和权限,基本都能解决。