SFTP 协议(千字长文)

什么是 SFTP 协议

SFTP(SSH File Transfer Protocol)是一种基于 SSH(Secure Shell)的文件传输协议,用于在安全加密的通道中传输文件。与传统的 FTP 不同,SFTP 具有更高的安全性,因为它在传输过程中加密数据和身份验证信息,防止数据被窃听或篡改。

核心概念

SFTP 协议本质上是 SSH 协议的一个子系统,它利用 SSH 的加密机制,提供文件传输、目录操作、权限设置等功能。SFTP 与 FTP 不同,它不使用单独的控制和数据连接,而是通过一个安全的 SSH 通道完成所有操作,简化了配置并增强了安全性。

常用命令

下表列出了在使用 SFTP 协议时最常用的命令及其功能说明:

命令 功能说明 使用频率
sftp user@host 连接到远程服务器 ★★★★★
put file 上传本地文件到远程服务器 ★★★★☆
get file 从远程服务器下载文件 ★★★★☆
ls 列出远程服务器目录内容 ★★★★☆
cd directory 进入远程服务器的指定目录 ★★★★☆
mkdir dir 在远程服务器创建新目录 ★★★☆☆
rm file 删除远程服务器上的文件 ★★★☆☆
rmdir dir 删除远程服务器上的空目录 ★★☆☆☆

基础命令示例

连接服务器

sftp user@192.168.1.100

这行命令通过 SFTP 协议连接到 IP 地址为 192.168.1.100 的服务器,使用用户名 user。连接成功后,会提示输入密码或使用密钥认证。

上传文件

put localfile.txt /remote/directory/

将本地文件 localfile.txt 上传到远程服务器的 /remote/directory/ 路径下。

下载文件

get remotefile.txt ./local/

从远程服务器下载文件 remotefile.txt 到本地当前目录下的 ./local/ 文件夹中。

列出远程目录内容

ls /remote/directory/

显示远程服务器 /remote/directory/ 目录下的文件和子目录列表。

高级使用场景

递归上传目录

put -r myproject /remote/directory/

-r 参数表示递归上传,将本地的 myproject 目录及其所有子文件和子目录上传至远程路径 /remote/directory/

自动化脚本连接

sftp -oPort=2222 -oIdentityFile=~/.ssh/id_rsa user@192.168.1.100 << EOF
put localfile.txt /remote/
get remotefile.txt ./local/
EOF

使用 -o 参数指定端口和密钥文件,通过 EOF(Here Document)方式实现自动化脚本连接,上传和下载文件无需手动输入命令。

查看远程文件的权限

lls -l

lls 用于列出本地文件,-l 参数展示详细信息,包括权限、大小和修改时间。

常见问题

1. SFTP 登录时提示 "Connection refused" 是怎么回事?

原因:通常是 SSH 服务未运行或端口不通。

解决:检查远程服务器的 SSH 服务状态,确认端口(默认 22)是否开放,防火墙是否拦截连接。

2. 如何避免每次输入密码?

解决:使用 SSH 密钥认证。将本地生成的公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中,即可实现免密码登录。

3. 上传大文件时很慢,怎么办?

解决:检查网络带宽,确认 SFTP 服务器未限制传输速度。此外,可以使用压缩工具(如 tar.gz)打包后再上传,减少传输时间。

4. SFTP 与 FTPS 有什么区别?

回答:SFTP 是基于 SSH 的安全协议,FTPS 是基于 TLS/SSL 的 FTP 安全扩展。SFTP 的加密机制更统一,命令在单个通道中执行;FTPS 则是 FTP 协议的增强版,需要在多个连接中处理加密和数据传输。

总结

SFTP 协议是基于 SSH 的安全文件传输方案,适合需要在不安全网络中安全传输文件的场景。掌握其基础命令和常见用法,能快速实现远程服务器的文件管理与同步。