暗色模式

SCP 与 SFTP 远程传输:从单文件复制到递归目录批量获取

技术教程
2026-08-28
24
0
本文要点
  • scpsftp 都基于 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 是什么

日常运维在服务器之间搬文件,最常用的工具就是 scpsftp。它们都基于 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 单文件上传

注意上面截图里 scp 命令本身没有任何输出——这是它的默认行为:除非出错或加了 -v,复制成功时静默退出,$? 为 0。所以"传没传成"要用 ls -lmd5sum 这类命令来验证。目标路径如果写成目录结尾,会保留原文件名: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

scp 递归下载目录

-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退出会话

getput 都支持第二个参数改名保存: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

sftp 交互式会话

这里用 -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——这套组合覆盖了绝大多数文件传输需求。

发表评论

暂无评论,快来抢沙发吧!