文章列表
4 分钟阅读
更新于

SCP 和 SFTP 使用指南:远程文件传输基础


系列:文件共享与传输

第 2 / 5 篇

  1. 用 vsftpd 在 Ubuntu 上搭建文件共享服务器
  2. SCP 和 SFTP 使用指南:远程文件传输基础
  3. Samba 安装与配置指南:Linux 和 Windows 文件共享
  4. NFS 安装与配置指南:Linux 系统间文件共享
  5. Syncthing 异地同步指南:多设备文件同步不带公网 IP

背景

日常往服务器传文件——部署代码、拉日志、备份配置——如果不想专门搭建 FTP 服务,可以直接用 SSH 自带的 SCP 和 SFTP。它们共享本机已有的 SSH 认证和加密通道(基于 SSH 协议架构 RFC 4251),无需额外开端口、装软件,比 用 vsftpd 在 Ubuntu 上搭建文件共享服务器 轻量得多。

SCP 和 SFTP 复用 SSH 认证,建议先配置密钥对避免每次输入密码:

Terminal window
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 协议,适合一次性推送或拉取文件,用完即走。

上传到远程

Terminal window
# 上传单个文件
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/

从远程下载

Terminal window
scp user@host:/var/log/app.log ./logs/
scp -r user@host:/remote/dir ./

指定端口和密钥

Terminal window
# 非默认端口
scp -P 2222 /local/file user@host:/remote/
# 使用指定私钥
scp -i ~/.ssh/my_key /local/file user@host:/remote/

注意:SCP 端口参数是大写 -P,与 SSH 客户端的 -p 不同。

压缩传输

Terminal window
scp -C large.tar.gz user@host:/remote/

-C 选项在传输时压缩数据,对低速网络或未压缩的大文件有效。

2. SFTP:交互式文件管理

SFTP(SSH File Transfer Protocol)启动一个交互式会话,可以浏览、增删远程文件,像操作本地目录一样。

连接

Terminal window
sftp user@host
sftp -P 2222 user@host
sftp -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退出会话

批量操作

Terminal window
sftp> mget *.log # 下载所有 .log 文件
sftp> mput *.tar.gz # 上传所有 tar.gz 包

mgetmput 支持通配符,默认每传输一个文件都会询问确认。要跳过确认,可以提前用 prompt off 关闭交互提示。

断点续传

SCP 不支持续传,SFTP 可以用 regetreput 从中断位置继续:

Terminal window
sftp> reget large_bak.sql
sftp> reput local_bak.tar.gz

前提是远程和本地的文件内容没有发生变化。

常见问题

1. 权限拒绝

目标目录没有写权限或属主不匹配。登录后先 ls -la /target/path 确认权限,必要时以有 sudo 权限的用户登录,或预先调整目录权限。SFTP 里也能直接 chmod 修改权限(如果允许)。

2. 路径中包含空格

Terminal window
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 子系统路径未正确配置。可以强制指定子系统:

Terminal window
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 完全够用。