
注: 本文为安丫科技刘峰的原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
文件传输用什么最稳妥?
Linux 上的 SCP 凭借 SSH 的加密与零配置优势,成为最常用的“搬运神器”。
本文从原理拆解到命令实操,再到常见问题与安全实践,帮你彻底吃透 SCP。
01
SCP 核心原理:基于 SSH 的
安全传输
SCP 并非独立协议,而是依托 SSH 协议实现加密传输的工具,其核心工作流程与安全特性完全依赖 SSH,具体原理如下:
传输流程
建立 SSH 连接
SCP 客户端首先与目标主机的 SSH 服务端(默认端口 22)建立 TCP 连接,完成 SSH 的身份认证(密码或密钥认证);
协商加密算法
认证通过后,SSH 双方协商对称加密算法(如 AES-256)和消息认证算法(如 HMAC-SHA256),后续文件数据均通过协商的加密通道传输;
执行复制操作
SCP 在加密通道中发送文件元数据(文件名、大小、权限)和二进制数据,目标主机接收后还原为原始文件;
断开连接
复制完成后,SCP 主动关闭 SSH 连接,释放资源。
核心特性
安全性
继承 SSH 的加密机制,所有数据(包括文件内容、用户名、密码)均经过加密,避免中间人窃听或数据篡改;
易用性
命令格式简洁,无需额外配置服务,仅需掌握基础参数即可使用;
跨平台性
支持 Linux、Unix、macOS,Windows 可通过 PuTTY(pscp)、Git Bash、WSL 等环境使用;
完整性
传输过程中会校验文件校验和,确保文件传输后与原始文件一致(默认开启,无需额外参数)。
02
SCP 基础命令:语法与核心参数
SCP 的命令格式分为 "本地→远程"和 "远程→本地"两种场景,核心参数一致,仅需调整源路径和目标路径的位置。
基本语法
场景 1:本地文件 目录 复制到 远程主机
# 复制文件
scp [参数] 本地文件路径 远程用户@远程主机IP:远程目标路径
# 复制目录(需加-r参数,递归复制)
scp [参数] -r 本地目录路径 远程用户@远程主机IP:远程目标路径
场景 2:远程主机文件 目录 复制到 本地
# 复制文件
scp [参数] 远程用户@远程主机IP:远程文件路径 本地目标路径
# 复制目录(需加-r参数)
scp [参数] -r 远程用户@远程主机IP:远程目录路径 本地目标路径
核心参数说明
SCP 的参数较少且易用,常用参数如下:

SCP 实战示例:覆盖常见使用场景
结合实际工作中高频场景,通过示例详解 SCP 的具体用法,所有示例基于 "本地主机(192.168.2.45)"和 "远程主机(192.168.2.46,用户 test,SSH 默认端口 22)"环境。
场景 1:本地文件复制到远程主机
需求:将本地/dbsoft/postgresql-18beta3.tar.gz文件复制到远程主机/tmp/目录,保留文件属性。
# 命令
scp -p dbsoft/postgresql-18beta3.tar.gz test@192.168.2.46:/tmp
test@192.168.2.46's password:
postgresql-18beta3.tar.gz 100% 28MB 124.5MB/s 00:00
# 执行过程说明
# 1. 首次连接会验证远程主机指纹,输入"yes”确认;
# 2. 输入远程用户test的密码(若配置SSH免密则无需输入);
# 3. 显示传输进度,完成后退出。
#检查远程主机
ll postgresql-18beta3.tar.gz
-rw-r--r--. 1 test test 29153087 Sep 1 10:52 postgresql-18beta3.tar.gz
场景 2:远程文件复制到本地
需求:将远程主机/tmp/postgresql-18beta3.tar.gz文件复制到本地 tmp目录,指定 SSH 端口为 2222。
# 命令(注意:-P参数需放在源路径和目标路径前)
scp -P 2222 test@192.168.2.46:/tmp/postgresql-18beta3.tar.gz tmp
test@192.168.2.46's password:
postgresql-18beta3.tar.gz 100% 28MB 144.1MB/s 00:00
场景 3:本地目录递归复制到远程
需求:将本地/home/postgres/目录(含子目录和文件)复制到远程主机/tmp/目录,启用压缩传输。
# 命令(必须加-r参数,-C启用压缩)
scp -r -C home/postgres/ test@192.168.2.46:/tmp
# 说明:传输目录时,若远程目标路径不存在,会自动创建;若存在,会将本地目录复制到该路径下。
场景 4:远程目录复制到本地
需求:将远程主机/home/test目录复制到本地/tmp目录,使用 SSH 密钥认证(免密)。
# 前提:本地已生成SSH密钥对,并将公钥上传到远程主机(ssh-copy-id test@192.168.2.46)
# 命令(-i指定私钥路径)
scp -r -i ~/.ssh/id_rsa test@192.168.2.46:/home/test tmp
场景 5:静默模式复制(适合脚本)
需求:在自动化脚本中,将本地/home/user/data.csv文件复制到远程主机,不显示传输进度(避免干扰脚本输出)。
# 命令(-q启用静默模式)
scp -q dbsoft/postgresql-18beta3.tar.gz test@192.168.2.46:/tmp
# 说明:静默模式下仅在出错时输出错误信息,成功时无任何输出,适合crontab定时任务或批量脚本。
04
SCP 常见问题与解决方案
SCP 使用中可能遇到连接失败、传输中断、权限报错等问题,多数与 SSH 配置、路径权限或网络相关,以下是高频问题及排查方法。
问题 1:连接失败(Connection refused)
现象
scp local.txt test@192.168.2.46:/home/test/
ssh: connect to host 192.168.2.46 port 22: Connection refused
lost connection
可能原因与解决
1)远程主机 SSH 服务未启动:登录远程主机,执行systemctl start sshd启动服务;
2)SSH 端口错误:若远程主机修改了 SSH 端口(如 2222),需用-P参数指定,如scp -P 2222 local.txt ...;
3)防火墙拦截:远程主机防火墙(firewalld/iptables)未开放 SSH 端口,执行firewall-cmd --add-port=22/tcp --permanent && firewall-cmd --reload开放端口。
问题 2:权限拒绝(Permission denied)
现象
scp local.txt test@192.168.2.46:/root/
scp: root/local.txt: Permission denied
可能原因与解决
1)远程目标路径权限不足
普通用户(如 test)无权限写入/root/目录,需更换目标路径(如/home/test/),或使用 root 用户登录(需远程主机允许 root SSH 登录);
2)本地文件权限不足
本地文件仅所有者可读(如权限 600),且执行 SCP 的用户非文件所有者,需修改本地文件权限(如chmod 644 local.txt)。
问题 3:无法复制目录(not a regular file)
现象
scp home/user/project/ test@192.168.2.46:/home/test/
scp: home/user/project/: not a regular file
原因与解决
未加-r参数(递归复制),SCP 默认仅复制文件,复制目录必须加-r,正确命令:
scp -r home/user/project/ test@192.168.2.46:/home/test/
问题 4:传输中断(大文件或弱网络)
现象
传输大文件(如 10GB)时,因网络波动导致传输中断,需重新开始。
解决方法
SCP 不支持断点续传,若需断点续传,可改用rsync工具(基于 SSH,支持断点续传),命令示例:
# rsync断点续传远程目录到本地(--partial支持断点,-P显示进度)
rsync -avz --partial -e "ssh -p 22" test@192.168.2.46:/home/test/large_dir/ /home/user/local_dir/
05
SCP 与其他工具对比:
适用场景选择
Linux 下文件传输工具较多,除 SCP 外,还有rsync、SFTP等,需根据场景选择合适工具,以下是核心对比:

结论
简单的一次性文件 / 目录复制用 SCP;
大文件或需增量同步用 rsync;
手动交互式管理文件用 SFTP。


06
SCP 安全最佳实践
SCP 依托 SSH 的安全性,但需配合合理配置才能最大化安全,以下是生产环境中的最佳实践:
1)禁用密码认证,仅用密钥认证:
远程主机修改/etc/ssh/sshd_config,设置PasswordAuthentication no,避免密码泄露风险;
本地生成 SSH 密钥对(ssh-keygen -t rsa -b 4096),用ssh-copy-id上传公钥到远程主机。
2)修改 SSH 默认端口:
远程主机修改sshd_config的Port为非 22 端口(如 2222),减少端口扫描攻击,SCP 使用时需加-P 2222参数。
3)限制 SCP 使用用户:
远程主机通过sshd_config的AllowUsers配置,仅允许指定用户(如 test)使用 SSH(含 SCP),示例:AllowUsers test admin。
4)避免传输敏感文件明文:
若传输密码、密钥等敏感文件,建议先压缩加密(如zip -e sensitive.zip sensitive.txt),再用 SCP 传输,双重保障。
写在最后
SCP 的优势可以用 8 个字概括:
“零配置,开箱即用”。
想快速传个文件?用 SCP;
要断点续传、大规模同步?配合 rsync;
临时文件管理?上 SFTP。
只要 SSH 通了,SCP 就能跑。
掌握它,你不仅能少走弯路,还能快速进阶到 自动化运维 / 批量部署 的更高层次 。

作者介绍
大家好,我是刘峰,安丫科技创始人 & 数据库技术高级讲师,专注于 PostgreSQL、国产数据库运维与迁移、数据库性能优化 等方向。
作为 PG中国分会官方授权讲师、PostgreSQL ACE 讲师认证专家,我长期活跃在一线项目实战中,拥有 10年以上大型数据库管理与优化经验,曾深度参与电信、金融、政务等多个行业的数据库性能调优与迁移项目。
欢迎关注我,一起深入探索数据库的无限可能,技术交流不设限!
📌 觉得有收获的话,记得点赞、收藏、转发支持一下哦,别忘了关注我获取更多数据库干货~
关键词回复(可见相应文章):
oracle、mysql、pg、postgresql、sql、性能优化、故障处理、数据迁移、备份恢复、版本升级、补丁管理、深度巡检、解决方案、架构设计......

有任何问题或疑问,欢迎加V进群探讨哦~
\ | /
★
动动你的手指
给【安呀智数据坊】加个星标吧~
这样你就不会丢下我啦~
记得加星标呀!









