一、前置准备
- 环境要求:本地或远程服务器为 Linux 系统(如 CentOS 7/8、Ubuntu 20.04/22.04、Debian 11 等),且已安装并启用 SSH 服务(SFTP 基于 SSH 协议,默认使用 22 端口,无需额外部署 FTP 服务)。
- 账号准备:拥有服务器的合法用户账号(推荐普通用户,如linuxuser,避免直接使用root操作以保障系统安全)。
- 连接条件:服务器 22 端口未被防火墙屏蔽(Linux 默认允许 SSH 连接,若需配置可参考 “注意事项” 部分)。
二、Linux 下用 SFTP 实现 FTP 核心功能(22 端口)
SFTP 不仅支持文件传输加密,还能实现传统 FTP 的所有核心操作(上传、下载、目录管理等),且无需额外开放端口,直接通过 SSH 的 22 端口即可使用,操作均在 Linux 终端完成。
1. 第一步:通过 SFTP 连接服务器
打开 Linux 终端,输入以下命令连接远程服务器(若操作本地服务器,将 IP 替换为localhost或127.0.0.1):
# 格式:sftp 用户名@服务器IP/域名sftp linuxuser@192.168.1.100
- 执行后输入用户密码,若提示Connected to 192.168.1.100,则表示连接成功,终端前缀将变为sftp>,进入 SFTP 交互模式。
2. 第二步:SFTP 核心操作命令(与 FTP 兼容)
SFTP 命令与传统 FTP 命令逻辑一致,部分命令加 “l” 区分 “本地操作”,以下为高频操作示例(以 Web 服务目录/var/www/html为例):
功能需求 | SFTP 命令示例 | 说明 |
查看服务器目录 | ls(当前目录)ls /var/www/html(指定目录) | 列出服务器端目录下的文件 / 文件夹,类似 FTP 的ls命令 |
切换服务器目录 | cd /var/www/html | 进入服务器的 Web 服务根目录,后续操作将基于此目录 |
查看本地目录 | lls(当前本地目录)lls ~/Documents(指定本地目录) | 列出本地终端当前路径下的文件,“l” 代表 “local”(本地) |
切换本地目录 | lcd ~/Downloads | 将本地文件传输的 “源 / 目标路径” 切换到~/Downloads(用户下载目录) |
上传本地文件到服务器 | put ~/test.html /var/www/html | 将本地~/test.html文件上传到服务器/var/www/html目录 |
下载服务器文件到本地 | get /var/www/html/index.php ~/Documents | 将服务器index.php下载到本地~/Documents目录 |
上传本地文件夹到服务器 | put -r ~/website /var/www/html | 加-r参数 “递归上传” 本地website文件夹及所有子内容 |
下载服务器文件夹到本地 | get -r /var/www/html/static ~/Downloads | 递归下载服务器static文件夹到本地下载目录 |
在服务器创建目录 | mkdir /var/www/html/new_page | 在服务器 Web 目录下创建new_page子目录 |
删除服务器文件 | rm /var/www/html/old.txt | 删除服务器指定路径的文件 |
删除服务器空目录 | rmdir /var/www/html/empty_dir | 仅能删除空目录,非空目录需先删除内部文件 |
退出 SFTP 连接 | exit或quit | 断开与服务器的 SFTP 连接,返回 Linux 普通终端模式 |
三、常见问题:SFTP 操作提示 “Permission denied(权限不够)”
1. 问题根源
当执行上传、修改、删除服务器文件 / 目录时(如向/var/www/html上传文件),若终端提示Permission denied,核心原因是:当前 SFTP 登录用户(如linuxuser)对目标目录 / 文件无 “写入(w)” 或 “执行(x,目录需执行权限才能进入)” 权限。
以 Web 服务目录/var/www/html为例,默认权限通常如下(通过ls -ld /var/www/html查看):
drwxr-xr-x 2 root apache 4096 Oct 10 14:30 /var/www/html
- 权限解读:drwxr-xr-x中,第 2-4 位rwx是属主(root)权限,第 5-7 位r-x是属组(apache,Web 服务组)权限,第 8-10 位r-x是 “其他用户” 权限;
- 问题关键:普通用户linuxuser属于 “其他用户”,仅有 “读(r)” 和 “进入目录(x)” 权限,无 “写入(w)” 权限,因此无法上传文件。
2. 临时解决方案:直接开放目录写入权限(适合测试)
若仅需临时测试 SFTP 上传功能,可给目标目录添加 “其他用户写入权限”(不推荐长期使用,存在安全风险),命令如下:
# 先通过SSH登录服务器(非SFTP模式),执行权限修改ssh linuxuser@192.168.1.100# 输入密码后,执行sudo命令开放权限(需用户有sudo权限)sudo chmod o+w /var/www/html
- 验证:再次执行ls -ld /var/www/html,若权限变为drwxr-xrwx,则 “其他用户” 已拥有写入权限,重新连接 SFTP 即可正常上传。
3. 长期解决方案:将用户加入 Web 服务组(安全推荐)
为兼顾安全与权限需求,正确做法是将当前 SFTP 用户加入 Web 服务专属组(通过组权限获取操作权限),不同 Linux 发行版的 Web 服务组名不同,需先确认组名。
四、详细步骤:将当前用户加入 Web 服务组
1. 第一步:确定 Web 服务组名(关键!区分发行版)
Web 服务常见为Apache或Nginx,不同 Linux 系统的默认服务组名如下表,可通过命令验证:
Linux 发行版 | Apache 服务组名 | Nginx 服务组名 |
CentOS/RHEL/Fedora | apache | nginx |
Ubuntu/Debian | www-data | www-data |
openSUSE | wwwrun | nginx |
命令验证 Web 服务组名(服务器端执行)
以 Apache 为例,通过进程查看属组:
# 查看Apache进程(CentOS用httpd,Ubuntu用apache2)ps aux | grep httpd # CentOS系统# 或ps aux | grep apache2 # Ubuntu系统
输出示例(CentOS):
root 1234 0.0 0.2 245680 4560 ? Ss 14:00 0:00 /usr/sbin/httpd -DFOREGROUNDapache 1235 0.0 0.1 245680 2340 ? S 14:00 0:00 /usr/sbin/httpd -DFOREGROUND
- 关键:进程中 “USER” 列的非root用户(如apache)即为 Web 服务组名。
若使用 Nginx,执行:
ps aux | grep nginx
输出中 “USER” 列的nginx(CentOS)或www-data(Ubuntu)即为组名。
2. 第二步:将当前用户加入 Web 服务组
假设当前用户为linuxuser,根据发行版执行对应命令(需sudo权限,若用户无sudo,需先用root登录执行):
命令格式
# 通用格式:sudo usermod -aG Web服务组名 当前用户名# CentOS(Apache组)sudo usermod -aG apache linuxuser# CentOS(Nginx组)sudo usermod -aG nginx linuxuser# Ubuntu/Debian(Apache/Nginx通用组)sudo usermod -aG www-data linuxuser
- 参数说明:-aG表示 “将用户追加(Append)到指定组(Group)”,避免覆盖用户原有所属组(若用-G会删除原有组,仅保留指定组,需谨慎)。
3. 第三步:验证用户是否成功加入组
方法 1:查看用户所属组
groups linuxuser
输出示例(CentOS,用户加入 apache 组后):
linuxuser : linuxuser apache
- 若输出中包含 Web 服务组名(如apache),则表示加入成功。
方法 2:查看用户组 ID 信息
id linuxuser
输出中groups=…(48)apache…(48 为 apache 组的 ID),也可确认加入成功。
4. 第四步:重新登录 SFTP 使组权限生效
组权限修改后不会立即生效,需退出当前 SFTP/SSH 连接,重新登录:
# 退出当前SFTP(若在SFTP模式)exit# 重新连接SFTPsftp linuxuser@192.168.1.100
5. 第五步:修复 Web 目录属组(可选,确保权限匹配)
若 Web 目录(如/var/www/html)的属组不是 Web 服务组,需修改目录属组以匹配:
# 先通过SSH登录服务器ssh linuxuser@192.168.1.100# CentOS(将目录属组改为apache)sudo chgrp -R apache /var/www/html# Ubuntu(将目录属组改为www-data)sudo chgrp -R www-data /var/www/html
- 参数-R:递归修改目录下所有子文件、子目录的属组,确保整个 Web 目录权限统一。
五、验证最终效果
重新通过 SFTP 连接服务器,执行上传操作测试:
# SFTP模式下,上传本地文件到Web目录put ~/test.html /var/www/html
- 若终端无Permission denied提示,且通过ls /var/www/html能看到test.html,则配置成功;
- 若仍失败,重新执行ls -ld /var/www/html确认:目录属组为 Web 服务组,且当前用户已在该组中。
六、注意事项
- 禁用 root 用户 SFTP 登录:编辑/etc/ssh/sshd_config,添加PermitRootLogin no,重启 SSH 服务(sudo systemctl restart sshd),避免 root 权限泄露风险。
- 防火墙开放 22 端口:若连接失败,检查防火墙配置:
- CentOS/RHEL:sudo firewall-cmd –permanent –add-port=22/tcp && sudo firewall-cmd –reload
- Ubuntu/Debian:sudo ufw allow 22 && sudo ufw reload
- 遵循权限最小化原则:Web 目录权限建议设为drwxr-xr-x(属主root,属组 Web 组),文件权限设为rw-r–r–,无需给 “其他用户” 开放写入权限。
- SFTP 日志查看:若遇未知错误,查看 SSH 日志定位问题:
- CentOS:sudo cat /var/log/secure
- Ubuntu:sudo cat /var/log/auth.log