系列:文件共享与传输
背景
日常往服务器传文件——部署代码、拉日志、备份配置——如果不想专门搭建 FTP 服务,可以直接用 SSH 自带的 SCP 和 SFTP。它们共享本机已有的 SSH 认证和加密通道(基于 SSH 协议架构 RFC 4251),无需额外开端口、装软件,比 用 vsftpd 在 Ubuntu 上搭建文件共享服务器 轻量得多。
SCP 和 SFTP 复用 SSH 认证,建议先配置密钥对避免每次输入密码:
ssh-keygen -t ed25519 -C "your_email@example.com"ssh-copy-id user@host如果使用非默认密钥,后续命令中加 -i ~/.ssh/id_ed25519 指定。密钥文件权限必须为 600,否则 SSH 会拒绝使用。
这篇文章记录 SCP 和 SFTP 的常用命令、进阶用法,以及在权限、续传和路径处理上的实际踩坑经验。
步骤
1. SCP:单次快速传输
SCP(Secure Copy)基于 SSH 协议,适合一次性推送或拉取文件,用完即走。
上传到远程
# 上传单个文件scp /local/path/app.conf user@host:/etc/app/
# 上传并重命名scp /local/path/app.conf user@host:/etc/app/prod.conf
# 上传整个目录(递归)scp -r /local/dir user@host:/remote/path/从远程下载
scp user@host:/var/log/app.log ./logs/scp -r user@host:/remote/dir ./指定端口和密钥
# 非默认端口scp -P 2222 /local/file user@host:/remote/
# 使用指定私钥scp -i ~/.ssh/my_key /local/file user@host:/remote/注意:SCP 端口参数是大写 -P,与 SSH 客户端的 -p 不同。
压缩传输
scp -C large.tar.gz user@host:/remote/-C 选项在传输时压缩数据,对低速网络或未压缩的大文件有效。
2. SFTP:交互式文件管理
SFTP(SSH File Transfer Protocol)启动一个交互式会话,可以浏览、增删远程文件,像操作本地目录一样。
连接
sftp user@hostsftp -P 2222 user@hostsftp -i ~/.ssh/my_key user@host连接后进入 sftp> 提示符,常用命令:
| 命令 | 说明 |
|---|---|
ls / cd / pwd | 浏览远程目录 |
lls / lcd / lpwd | 操作本地目录 |
get file | 下载文件到本地当前目录 |
get -r dir | 递归下载目录 |
put file | 上传文件到远程当前目录 |
put -r dir | 递归上传目录 |
rm / rmdir / mkdir | 删除文件、空目录,创建远程目录 |
bye / exit | 退出会话 |
批量操作
sftp> mget *.log # 下载所有 .log 文件sftp> mput *.tar.gz # 上传所有 tar.gz 包mget 和 mput 支持通配符,默认每传输一个文件都会询问确认。要跳过确认,可以提前用 prompt off 关闭交互提示。
断点续传
SCP 不支持续传,SFTP 可以用 reget 和 reput 从中断位置继续:
sftp> reget large_bak.sqlsftp> reput local_bak.tar.gz前提是远程和本地的文件内容没有发生变化。
常见问题
1. 权限拒绝
目标目录没有写权限或属主不匹配。登录后先 ls -la /target/path 确认权限,必要时以有 sudo 权限的用户登录,或预先调整目录权限。SFTP 里也能直接 chmod 修改权限(如果允许)。
2. 路径中包含空格
scp "/local/my data.csv" user@host:"/remote/my data.csv"SFTP 内同样需要用引号:get "my log.txt"。如果不加引号,Shell 会把空格前后的部分解释成不同参数。
3. 大文件传输中断
SCP 只能删掉已传的不完整文件重新传。如果网络不稳定,建议换成 SFTP 的 reget 续传,或者改用 rsync 使用指南:服务器文件同步与备份 中的 rsync --partial,它支持增量同步和断点续传,比 SCP 更适合大文件或弱网场景。
4. SFTP 登录后无法列出目录
有时用户登录 Shell 不是标准的 bash/sh,或服务端 SFTP 子系统路径未正确配置。可以强制指定子系统:
sftp -s /usr/lib/openssh/sftp-server user@host如果问题依旧,检查 /etc/ssh/sshd_config 中的 Subsystem sftp 配置项。
5. 连接超时
先用 ssh user@host 测试 SSH 连接是否正常。如果 SCP 传输中卡住,加上 -v 查看调试输出,排查防火墙、DNS 或 SSH 配置问题。
总结
SCP 和 SFTP 是 SSH 自带的两把“小刀”,SCP 适合单次快速的发件收件,SFTP 则提供了交互式管理和续传能力。和需要额外搭建的 FTP(如 用 vsftpd 在 Ubuntu 上搭建文件共享服务器)相比,它们胜在零配置,且复用本机已有的 SSH 安全机制。当传输遇到频繁中断或需要处理大量文件时,再考虑切换到 rsync 使用指南:服务器文件同步与备份,日常传几十份配置,SCP 和 SFTP 完全够用。