当前位置: 首页 > news >正文

SCP 命令完整指南

SCP (Secure Copy Protocol) 是基于 SSH 的安全文件传输工具,用于在本地和远程主机之间复制文件。


📋 目录

  • 基本语法
  • 常用选项
  • 上传文件(本地 → 远程)
  • 下载文件(远程 → 本地)
  • 远程到远程传输
  • 目录操作
  • 高级用法
  • 实用技巧
  • 常见问题

基本语法

scp [选项] 源路径 目标路径

路径格式:

  • 本地路径:直接写 /path/to/file
  • 远程路径:user@host:/path/to/file

常用选项

选项 说明
-r 递归复制目录
-P 指定远程 SSH 端口(大写)
-p 保留文件权限和时间戳(小写)
-q 静默模式,不显示进度
-v 详细模式,显示调试信息
-C 启用压缩传输
-i 指定私钥文件
-l 限制带宽(Kbit/s)
-c 指定加密算法
-3 通过本地主机传输(远程到远程)
-o 传递 SSH 选项

上传文件(本地 → 远程)

1. 上传单个文件

# 基本用法
scp local_file.txt user@remote:/path/to/destination/# 示例:上传到远程主目录
scp ./app.log root@192.168.1.100:~/# 示例:上传并重命名
scp ./config.yml root@server:/etc/myapp/config.yml# 示例:上传到指定目录
scp ./data.csv user@example.com:/var/data/

2. 上传多个文件

# 上传多个文件
scp file1.txt file2.txt file3.txt user@remote:/path/# 使用通配符
scp *.log user@remote:/var/logs/# 使用大括号扩展
scp app.{js,css,html} user@remote:/var/www/

3. 上传目录

# 递归上传整个目录
scp -r ./mydir user@remote:/path/to/destination/# 示例:上传项目到服务器
scp -r ./myproject root@server:/var/www/# 保留权限和时间戳
scp -rp ./website root@server:/var/www/html/

4. 指定端口上传

# 远程 SSH 使用非标准端口
scp -P 2222 ./file.txt user@remote:/path/

5. 使用密钥上传

# 指定私钥文件
scp -i ~/.ssh/id_rsa ./file.txt user@remote:/path/# 指定 PEM 密钥(AWS EC2 等)
scp -i ./my-key.pem ./app.zip ec2-user@12.34.56.78:/home/ec2-user/

下载文件(远程 → 本地)

1. 下载单个文件

# 基本用法
scp user@remote:/path/to/file.txt ./local/path/# 示例:下载到当前目录
scp root@192.168.1.100:/var/log/syslog ./# 示例:下载并重命名
scp user@server:/remote/data.json ./backup/data_2026.json# 示例:下载到指定路径
scp ubuntu@aws-server:/home/ubuntu/app.log ~/Downloads/

2. 下载多个文件

# 下载多个文件(需要用引号)
scp user@remote:/path/'{file1.txt,file2.txt}' ./# 下载所有 .log 文件
scp user@remote:/var/log/*.log ./

3. 下载目录

# 递归下载整个目录
scp -r user@remote:/path/to/dir ./local/path/# 示例:下载日志目录
scp -r root@server:/var/log/nginx ~/nginx-logs/# 保留权限下载
scp -rp user@remote:/var/www ./www-backup/

4. 指定端口下载

scp -P 2222 user@remote:/path/file.txt ./

5. 使用密钥下载

scp -i ~/.ssh/my_key.pem user@remote:/path/file.txt ./

远程到远程传输

1. 直接传输

# 从 server1 传到 server2(数据不经过本地)
scp user1@server1:/path/file.txt user2@server2:/path/# 示例:服务器之间迁移文件
scp root@old-server:/var/www/html/* root@new-server:/var/www/html/

2. 通过本地中转

# 强制通过本地主机传输(防火墙场景)
scp -3 user1@server1:/path/file.txt user2@server2:/path/

目录操作

1. 复制整个网站

# 上传网站到服务器
scp -rp ./html/* root@server:/var/www/html/# 从服务器备份网站
scp -rp root@server:/var/www/html/ ./website-backup/

2. 同步项目代码

# 上传项目(排除 node_modules)
scp -r ./src ./public ./package.json user@server:/var/www/myapp/# 完整项目部署
scp -r ./myproject root@server:/opt/apps/

3. 备份远程目录

# 带时间戳备份
scp -rp root@server:/etc/nginx ~/backups/nginx-$(date +%Y%m%d)/# 定期备份脚本
#!/bin/bash
BACKUP_DIR=~/backups
DATE=$(date +%Y%m%d_%H%M%S)
scp -rp root@server:/var/www $BACKUP_DIR/www_$DATE/

高级用法

1. 限速传输

# 限制为 1MB/s (8192 Kbit/s)
scp -l 8192 ./large_file.iso user@remote:/path/# 限制为 500KB/s (4096 Kbit/s)
scp -l 4092 -r ./videos/ user@remote:/backup/

2. 压缩传输

# 启用压缩(适合文本文件、源代码)
scp -C ./logs/* user@remote:/var/log/# 压缩 + 保留权限
scp -Crp ./project/ user@server:/opt/

3. 显示传输进度

# 详细模式显示进度
scp -v ./file.txt user@remote:/path/# 静默模式(不显示进度,适合脚本)
scp -q ./file.txt user@remote:/path/

4. 指定加密算法

# 使用更快的加密算法
scp -c aes128-ctr ./file.txt user@remote:/path/# 使用更安全的算法
scp -c aes256-gcm@openssh.com ./sensitive.txt user@remote:/path/

5. 传递 SSH 选项

# 禁用严格主机检查
scp -o StrictHostKeyChecking=no ./file.txt user@remote:/path/# 连接超时设置
scp -o ConnectTimeout=10 ./file.txt user@remote:/path/# 使用 ProxyJump 跳板机
scp -o ProxyJump=jumpuser@jumphost ./file.txt user@target:/path/# 禁用密码认证(只用密钥)
scp -o PasswordAuthentication=no -i ~/.ssh/key.pem ./file.txt user@remote:/path/

6. 通过跳板机传输

# 方法1:使用 ProxyJump
scp -o ProxyJump=jumpuser@jumphost ./file.txt targetuser@target:/path/# 方法2:多跳(多个跳板机)
scp -o ProxyJump="user1@jump1,user2@jump2" ./file.txt user@target:/path/# 方法3:先建立隧道
ssh -L 2222:target:22 jumpuser@jumphost -N -f
scp -P 2222 ./file.txt targetuser@localhost:/path/

7. 后台传输

# 使用 nohup 后台运行
nohup scp -r ./large_dir/ user@remote:/backup/ &# 配合 screen/tmux
screen -S filetransfer
scp -r ./data/ user@remote:/backup/
# Ctrl+A+D 分离

实用技巧

1. 快捷别名

# 添加到 ~/.bashrc 或 ~/.zshrc# 常用服务器别名
alias scpm='scp -P 2222 root@myserver.com'
alias scps='scp -i ~/.ssh/server_key.pem ubuntu@aws-server.com'# 常用选项组合
alias scpp='scp -p'      # 保留权限
alias scpr='scp -r'      # 递归
alias scpc='scp -C'      # 压缩# 快速部署
alias deploy='scp -r ./dist/* root@server:/var/www/html/'

2. SSH 配置简化

# ~/.ssh/config
Host myserverHostName 192.168.1.100User rootPort 2222IdentityFile ~/.ssh/my_key.pemHost awsHostName ec2-12-34-56-78.compute.amazonaws.comUser ec2-userIdentityFile ~/.ssh/aws-key.pem

使用简化后的配置:

# 之前
scp -P 2222 -i ~/.ssh/my_key.pem ./file.txt root@192.168.1.100:/path/# 之后
scp ./file.txt myserver:/path/# AWS
scp ./app.zip aws:/home/ec2-user/

3. 断点续传(配合 rsync)

# scp 不支持断点续传,大文件用 rsync
rsync -P -e ssh ./large_file.iso user@remote:/path/# -P 等同于 --partial --progress
# --partial 保留部分传输的文件
# --progress 显示进度

4. 批量传输脚本

#!/bin/bash
# batch_scp.shSERVER="root@192.168.1.100"
REMOTE_PATH="/var/www"
LOCAL_PATH="./dist"# 传输并显示进度
echo "开始传输到 $SERVER..."scp -r $LOCAL_PATH/* $SERVER:$REMOTE_PATH/if [ $? -eq 0 ]; thenecho "✅ 传输成功!"
elseecho "❌ 传输失败!"exit 1
fi

5. 传输验证

# 传输后验证 MD5
md5sum ./file.txt
ssh user@remote 'md5sum /path/file.txt'# 一步到位
scp ./file.txt user@remote:/path/ && \echo "本地: $(md5sum ./file.txt | cut -d' ' -f1)" && \ssh user@remote "远程: $(md5sum /path/file.txt | cut -d' ' -f1)"

常见问题

1. Permission denied

# 原因1:权限不足
# 解决:使用 sudo 或检查目标目录权限
ssh user@remote 'sudo chmod 777 /path/to/dir'# 原因2:密钥问题
# 解决:检查密钥权限
chmod 600 ~/.ssh/id_rsa
scp -i ~/.ssh/id_rsa ./file.txt user@remote:/path/# 原因3:目标目录不存在
# 解决:先创建目录
ssh user@remote 'mkdir -p /path/to/dir'
scp ./file.txt user@remote:/path/to/dir/

2. Connection refused

# 检查 SSH 服务
ssh user@remote 'systemctl status sshd'# 检查端口
scp -P 正确端口 ./file.txt user@remote:/path/# 检查防火墙
ssh user@remote 'sudo ufw status'

3. 传输中断

# 大文件用 rsync 代替
rsync -avzP ./large_file user@remote:/path/# 或使用 screen/tmux 防止断开
screen -S transfer
scp ./large_file user@remote:/path/

4. 速度慢

# 启用压缩
scp -C ./file.txt user@remote:/path/# 使用更快的加密算法
scp -c aes128-gcm@openssh.com ./file.txt user@remote:/path/# 如果网络稳定,可以降低加密强度
scp -c arcfour ./file.txt user@remote:/path/  # 不推荐生产环境

5. 中文文件名乱码

# 设置 locale
export LC_ALL=en_US.UTF-8
scp ./中文文件.txt user@remote:/path/# 或在远程设置
ssh user@remote 'export LC_ALL=en_US.UTF-8'

命令速查表

场景 命令
上传文件 scp file user@host:/path/
下载文件 scp user@host:/path/file ./
上传目录 scp -r dir/ user@host:/path/
下载目录 scp -r user@host:/path/dir ./
指定端口 scp -P 2222 file user@host:/path/
使用密钥 scp -i key.pem file user@host:/path/
保留权限 scp -p file user@host:/path/
压缩传输 scp -C file user@host:/path/
限速传输 scp -l 8192 file user@host:/path/
远程到远程 scp user1@host1:/file user2@host2:/path/
通过跳板机 scp -o ProxyJump=jump@host file target@host:/path/

SCP vs 其他工具

工具 优点 缺点 适用场景
scp 简单、无需额外配置 不支持断点续传 小文件、临时传输
rsync 断点续传、增量同步、更高效 命令稍复杂 大文件、定期同步
sftp 交互式、可浏览目录 需要交互操作 手动管理文件
nc 超快速度、无加密 不安全 内网临时传输

相关命令

# rsync - 更强大的同步工具
rsync -avz ./dir/ user@remote:/path/# sftp - 交互式文件传输
sftp user@remote# ssh - 远程执行
ssh user@remote 'cat /path/file.txt' > local_file.txt# tar + ssh - 打包传输(适合大量小文件)
tar czf - ./dir/ | ssh user@remote 'tar xzf - -C /path/'

参考资料

  • OpenSCP 官方文档
  • Linux scp 命令手册
http://www.jsqmd.com/news/560145/

相关文章:

  • 终极AI角色创建指南:5个技巧打造栩栩如生的SillyTavern角色卡片
  • MacBook用户必看:Arduino IDE配置ESP32开发环境全攻略(含M1/M2芯片适配)
  • 繁忙海港水域船舶精细识别与多目标跟踪研究
  • 探索基于FPGA的海德汉1313 Endat绝对值编码器PG卡源代码
  • 如何快速搭建本地开发环境:EServer完整使用指南
  • 如何快速掌握AI变声神器RVC:面向初学者的完整指南
  • 2026年西格列他钠适应症有哪些及适用人群分析 - 品牌排行榜
  • 别再乱调Keil优化等级了!手把手教你根据STM32项目需求精准配置-O0到-O3
  • 2026北京升降柱优质厂家推荐榜 - 真知灼见33
  • 5步攻克BepInEx Linux部署难题:从依赖到权限的系统解决方案
  • AI读脸术优化技巧:提升年龄性别识别准确率的实用方法
  • 技术复活:SpaceCadetPinball的跨平台开发指南
  • VeraCrypt加密U盘实战:从创建加密卷到日常使用的完整指南(2023最新版)
  • 盘点江苏靠谱的纱布居家服厂家,哪家性价比高值得推荐? - mypinpai
  • 高效掌握色彩校准:DisplayCAL Python 3 从入门到精通
  • Vivado+Vitis双剑合璧:从零构建Zynq-7020的SD卡Linux系统启动镜像
  • 5大维度解析F3D:重新定义3D文件查看体验的极速解决方案
  • 5步实战指南:基于Seata+ShardingSphere构建支付退款场景的分布式事务解决方案
  • 高效语音AI开发:Apple芯片上的文本与语音转换解决方案
  • 讲讲2026年全国好用的纱布居家服加工厂,选购要点在这里 - 工业设备
  • SmallThinker-3B-Preview代码能力评测:对比Claude Code的算法题解答效果
  • HunyuanVideo-Foley 实战:利用Python爬虫构建音效描述文本库
  • 校园场景下密码安全治理与多因素认证体系构建研究
  • 建筑工地AI监控避坑指南:YOLOv11+PyQt5开发中的7个常见错误
  • Ollama部署Meta Llama-3.2-3B实战:快速搭建本地AI问答机器人
  • APKLab深度集成解决方案:重新定义VS Code中的Android逆向工程工作流
  • 如何用RIGOL MSO5074准确测量高频信号?实测65MHz波形避坑指南
  • 视频创作效率翻倍:次元画室生成素材,AE制作动画(全流程解析)
  • 探讨2026年ISO认证正规企业,中鸿认证实力不容小觑 - mypinpai
  • CPython 3.15 Beta已内置AOT!现在不升级,Q3将错过性能红利窗口期