本文要点
scp与sftp都基于 SSH 加密通道传输文件,不需要额外搭建服务,一条命令即可完成上传下载;新版 scp 底层实际上已经改用 SFTP 协议。- scp 规则很简单:
scp 源 目标,本机路径直接写、远程路径写user@host:路径;-P指定端口(大写 P)、-i指定私钥。 - 常用参数:
-r递归复制目录、-C压缩传输、-l限速、-q静默、-v输出详细过程便于排错。 sftp是交互式文件管理器("SSH 的 FTP"),子命令put/get/ls/rm/mkdir/lcd兼顾浏览与传输,-b批处理可自动化脚本化。- 安全上这两者只负责传输,认证与加密全交给 SSH:优先用密钥认证、注意验证主机密钥(
known_hosts);需要增量同步时改用 rsync。
SCP 与 SFTP 是什么
日常运维在服务器之间搬文件,最常用的工具就是 scp 和 sftp。它们都基于 SSH 加密通道工作:不用像 FTP 那样单独部署服务,只要目标机器开了 SSH(sshd),就能传输,中途数据全程加密,不会明文暴露在网络上。
scp(Secure Copy)是一次性复制:本地、远程各给一个路径,把文件从一边搬到另一边,复制完命令即退。sftp(Secure File Transfer Protocol)是交互式会话:登录后进入一个类似 FTP 的界面,可以浏览目录、上传、下载、删除,甚至可以挂进脚本做批处理。
顺带一个有意思的细节:从 OpenSSH 9.0 开始,scp 底层默认改用 SFTP 协议来实现传输(旧的 RC4 传输协议被淘汰),所以现在这两者的传输通道已经趋于一致,区别主要体现在使用方式上——scp 适合一条命令的快速复制,sftp 适合需要浏览、多步操作的场景。
本文演示环境是一台 Ubuntu 24.04(OpenSSH 9.6),演示用 TCP 回环(127.0.0.1)连到本机 sshd:root 身份操作,并提前建好了专用用户 transfer 和专用密钥 transfer_key(免密),测试文件在 /root/transfer/demo 下,远程侧是 /home/transfer。
scp 上手:上传与下载
scp 的语法只有两个位置:源和目标。路径写法分两种:
- 本机路径:直接写,如
demo/notes.txt - 远程路径:写
用户名@主机:路径,如transfer@127.0.0.1:up-notes.txt
把三个冒号签发给"从 A 到 B"和"从 B 到 A"两个方向,就是它的全部基本用法:
scp demo/notes.txt transfer@127.0.0.1:up-notes.txt # 本机 → 远程(上传)
scp transfer@127.0.0.1:/home/transfer/up-notes.txt ./down-notes.txt # 远程 → 本机(下载)命令中 -P 22 显式指定端口(注意是大写 P,SSH 登录用小写 -p,这是经典坑),-i transfer_key 指定私钥。实际跑一次并用 ls -l 验证结果:

注意上面截图里 scp 命令本身没有任何输出——这是它的默认行为:除非出错或加了 -v,复制成功时静默退出,$? 为 0。所以"传没传成"要用 ls -l、md5sum 这类命令来验证。目标路径如果写成目录结尾,会保留原文件名:transfer@127.0.0.1:/tmp/,等价于"放到该目录下"。
scp 常用参数:递归与限速
一次性复制单文件够用,但日常场景往往是整个目录、大文件,这时用这些参数:
| 参数 | 作用 |
|---|---|
-r | 递归复制整个目录及子目录 |
-C | 传输前压缩,文本/日志类文件带宽收益明显 |
-l 限速 | 限制带宽,单位 Kbit/s,避免占用整条链路 |
-q | 静默模式,连进度信息都不显示 |
-v | 详细输出,排错时看认证、协商过程 |
-p | 保留文件的修改时间与权限(小写 p) |
递归把远程目录拉回本地,再 ls -l 确认文件都在:
scp -r -i transfer_key transfer@127.0.0.1:/home/transfer/docs-v2 ./restored && ls -l restored
-r 会把源目录下的所有文件连同子目录结构一起复制过去。下载到本地的文件属主变成了当前用户 root(scp 不保留属主,只保留权限位),这是正常现象。
大文件传输时限速很实用,比如 scp -l 2048 -C data.bin remote@host:~/ 表示最多用 2048 Kbit/s(约 256 KB/s)的带宽,同时开压缩:避免一锅端把同机其他业务挤死。
sftp:交互式文件管理
需要"先看看远程有什么,再决定传哪个"时,scp 就不合适了,这时用 sftp。它登录后进入一个子命令模式(提示符 sftp>),像一个精简版的 FTP 客户端:
| 子命令 | 作用 | 子命令 | 作用 |
|---|---|---|---|
ls / ls -l | 列远程目录 | lcd / lpwd | 切换/查看本地目录 |
cd | 切换远程目录 | put | 本机 → 远程(上传) |
get | 远程 → 本机(下载) | mkdir / rmdir | 远程建/删空目录 |
rm | 删除远程文件 | bye / exit | 退出会话 |
get 和 put 都支持第二个参数改名保存:get remote.txt local.txt。截图里演示了一个完整会话:ls 查看远程、put demo/notes.txt up-notes.txt 上传、get up-notes.txt got-notes.txt 下载、再 ls -l 确认:
printf 'ls\nput demo/notes.txt up-notes.txt\nget up-notes.txt got-notes.txt\nls -l\nbye\n' | sftp -b - -P 22 -i transfer_key transfer@127.0.0.1
这里用 -b - 让 sftp 从标准输入读取批处理命令——每行一个子命令,效果和手工逐条输入一模一样。这样交互式的 sftp 会话就能写进脚本批量执行(比如定时把一堆日志 put 上去),也方便演示。手工用时直接 sftp -i transfer_key transfer@127.0.0.1 回车进入 sftp> 提示符逐个敲即可。
与 rsync 的取舍和安全实践
什么时候用哪个
- scp:一次性、单文件或整目录的快速复制,用法直观,没有同步状态。
- sftp:需要浏览远程目录、多步操作、或把传输写进脚本的交互场景。
- rsync:需要增量同步(只传变化的部分)、双向对比、断点续传式镜像或定时备份时——见《rsync 数据同步与备份》。普通文本/小文件用 scp 更省事。
认证与加密的建议
scp/sftp 本身不处理认证,全走 SSH:
- 优先用密钥认证:
ssh-keygen生成密钥对,把公钥放进远程~/.ssh/authorized_keys,再配合-i指定私钥。彻底告别密码明示与反复输入,也便于脚本自动化。 - 注意主机密钥验证:首次连接时 ssh 会询问是否信任对方服务器指纹并写入
~/.ssh/known_hosts,用于防止中间人攻击,请用ssh-keygen -H/ssh-keyscan等方式合理维护,别简单粗暴关掉StrictHostKeyChecking。 - 大文件记得限速压缩:
-l与-C组合使用,尤其在生产网络带宽紧张的机器群之间。 - 有关密钥生成、权限管理与登录加固的完整做法,可参考《SSH 服务器安全加固》与《Linux 文件权限:从 chmod 到 ACL》。
下次在服务器之间搬文件,记住 scp 源 目标 五秒钟能上手;要操作又管理,就 sftp;要增量备份,再上 rsync——这套组合覆盖了绝大多数文件传输需求。
评论 (0)
暂无评论,快来抢沙发吧!