Linux scp 命令超详细完整教程
一、scp 基础介绍
1. 作用
scp = secure copy,基于 SSH 加密传输文件,跨服务器复制文件/文件夹,传输全程加密,比 rcp、ftp 安全。
2. 前置条件
- 两台机器都安装 openssh-client / openssh-server
- 目标机器 SSH 端口开放(默认22)、防火墙放行
- 拥有对方服务器账号密码/免密密钥
3. 通用语法
bash
# 本地 → 远程
scp [参数] 本地文件/目录 用户名@远程IP:远程路径
# 远程 → 本地
scp [参数] 用户名@远程IP:远程文件/目录 本地路径
# 远程A → 远程B(中转传输)
scp [参数] 用户A@IPA:文件 用户B@IPB:路径
二、常用核心参数大全
| 参数 | 作用说明 |
|---|---|
-r |
递归复制文件夹(复制目录必须加) |
-P 端口 |
指定SSH端口(大写P!默认22可省略) |
-p |
保留文件原有权限、修改时间 |
-C |
传输时开启压缩,大文件提速 |
-v |
打印详细调试日志,排错用 |
-l 数值 |
限制传输带宽,单位Kbit/s |
-o ssh选项 |
传递ssh参数,如免密忽略主机校验 |
-i 私钥文件 |
使用指定私钥登录(密钥认证) |
三、实战示例(最常用场景)
场景1:本地单个文件上传到远程
bash
# 把本地 /root/test.txt 传到 192.168.1.100 的 /home/ubuntu/
scp /root/test.txt ubuntu@192.168.1.100:/home/ubuntu/
# 上传并重命名
scp test.txt ubuntu@192.168.1.100:/home/ubuntu/new_test.txt
场景2:本地文件夹上传(必须 -r)
bash
# 本地 data 文件夹完整上传远程
scp -r /root/data ubuntu@192.168.1.100:/home/ubuntu/
场景3:远程文件下载到本地
bash
# 拉取远程文件到当前本地目录
scp ubuntu@192.168.1.100:/home/ubuntu/log.txt ./
# 拉取远程文件夹到本地 /tmp
scp -r ubuntu@192.168.1.100:/home/ubuntu/logs /tmp
场景4:SSH非22端口传输(大写 -P)
服务器SSH改成 2222 端口,上传文件:
bash
# 上传
scp -P 2222 test.txt ubuntu@192.168.1.100:/home/ubuntu/
# 下载
scp -P 2222 ubuntu@192.168.1.100:/home/ubuntu/log.txt ./
# 传文件夹
scp -r -P 2222 /root/file ubuntu@192.168.1.100:/data
注意:小写
-p是保留权限,大写-P才是端口,极易踩坑!
场景5:使用私钥文件登录(免密密钥)
bash
scp -i /root/.ssh/id_rsa test.txt ubuntu@192.168.1.100:/home/ubuntu/
场景6:传输保留文件属性(权限、时间)
bash
scp -rp /root/package ubuntu@192.168.1.100:/opt/
场景7:大文件压缩传输提速 -C
bash
scp -Cr 本地大目录 root@10.0.0.5:/data/backup
场景8:限制传输带宽(限速)
限制带宽 1000Kbit/s:
bash
scp -l 1000 big.iso root@192.168.1.100:/mnt
场景9:远程A直接传到远程B(本机中转)
本机只是中转,文件从服务器A直接流向B:
bash
scp root@10.0.0.1:/data/file.tar root@10.0.0.2:/backup
场景10:调试排错,打印详细日志 -v
连接超时、认证失败时用,看完整SSH握手过程:
bash
scp -v test.txt ubuntu@192.168.1.100:/tmp
四、高级进阶用法
1. 一次性传输多个本地文件
bash
scp file1.txt file2.tar ubuntu@192.168.1.100:/home/ubuntu/
2. 忽略主机密钥校验(自动化脚本专用)
通过 -o 传递ssh参数,避免首次连接提示yes/no:
bash
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null test.txt ubuntu@192.168.1.100:/tmp
3. 后台静默传输(大文件不占终端)
配合 nohup 后台跑,关闭窗口不中断:
bash
nohup scp -r big_folder root@192.168.1.100:/mnt &
# 查看日志
tail -f nohup.out
五、免密传输(推荐,不用输密码)
步骤1:生成本机密钥
bash
ssh-keygen -t rsa
# 一路回车,不设置密钥密码
步骤2:推送公钥到远程服务器
bash
ssh-copy-id -p 2222 ubuntu@192.168.1.100
步骤3:之后scp无需输入密码
bash
scp test.txt ubuntu@192.168.1.100:/home/ubuntu
六、常见报错与解决方案
1. scp: Not a directory
原因:目标路径不存在 / 目标写成文件路径
解决:先登录远程 mkdir 创建文件夹
2. Permission denied
- 远程目录无写入权限:换
/tmp测试,或 chmod 放开权限 - 账号密码错误 / 私钥不匹配:核对账号、私钥文件
3. Connection refused
- SSH端口错误:确认端口,加
-P - 远程sshd未启动 / 防火墙拦截
bash
# 远程查看ssh状态
systemctl status sshd
4. lost connection 传输中断
- 网络波动:加
-C压缩、分段传输 - 服务器超时配置:修改
/etc/ssh/sshd_config延长超时
5. 复制文件夹漏掉 -r
报错 regular file,目录传输必须带 -r
七、scp 优缺点 & 替代工具
scp 缺点
- 不支持断点续传,断网从头传
- 海量小文件传输效率低
替代推荐(生产常用)
-
rsync :支持断点续传、增量同步、差量传输(优先推荐)
bashrsync -avz -P 本地目录 user@ip:/远程路径 -
sftp:交互式批量管理文件
-
rclone:云服务器/对象存储高速传输
八、最简速查模板
bash
# 上传文件夹、自定义端口、保留权限、压缩
scp -Crp -P 2222 /本地目录 user@IP:/远程目录
# 下载文件夹、私钥登录
scp -Cr -i /root/.ssh/id_rsa user@IP:/远程目录 /本地保存路径