分类: Uncategorized

  • Linux 服务器可直接用FTP软件实现传输文件(基于SSH协议)

    一、前置准备

    1. 环境要求:本地或远程服务器为 Linux 系统(如 CentOS 7/8、Ubuntu 20.04/22.04、Debian 11 等),且已安装并启用 SSH 服务(SFTP 基于 SSH 协议,默认使用 22 端口,无需额外部署 FTP 服务)。
    2. 账号准备:拥有服务器的合法用户账号(推荐普通用户,如linuxuser,避免直接使用root操作以保障系统安全)。
    3. 连接条件:服务器 22 端口未被防火墙屏蔽(Linux 默认允许 SSH 连接,若需配置可参考 “注意事项” 部分)。

    二、Linux 下用 SFTP 实现 FTP 核心功能(22 端口)

    SFTP 不仅支持文件传输加密,还能实现传统 FTP 的所有核心操作(上传、下载、目录管理等),且无需额外开放端口,直接通过 SSH 的 22 端口即可使用,操作均在 Linux 终端完成。

    1. 第一步:通过 SFTP 连接服务器

    打开 Linux 终端,输入以下命令连接远程服务器(若操作本地服务器,将 IP 替换为localhost127.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 服务常见为ApacheNginx,不同 Linux 系统的默认服务组名如下表,可通过命令验证:

    Linux 发行版Apache 服务组名Nginx 服务组名
    CentOS/RHEL/Fedoraapachenginx
    Ubuntu/Debianwww-datawww-data
    openSUSEwwwrunnginx

    命令验证 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 服务组,且当前用户已在该组中。

    六、注意事项

    1. 禁用 root 用户 SFTP 登录:编辑/etc/ssh/sshd_config,添加PermitRootLogin no,重启 SSH 服务(sudo systemctl restart sshd),避免 root 权限泄露风险。
    2. 防火墙开放 22 端口:若连接失败,检查防火墙配置:
    • CentOS/RHEL:sudo firewall-cmd –permanent –add-port=22/tcp && sudo firewall-cmd –reload
    • Ubuntu/Debian:sudo ufw allow 22 && sudo ufw reload
    1. 遵循权限最小化原则:Web 目录权限建议设为drwxr-xr-x(属主root,属组 Web 组),文件权限设为rw-r–r–,无需给 “其他用户” 开放写入权限。
    2. SFTP 日志查看:若遇未知错误,查看 SSH 日志定位问题:
    • CentOS:sudo cat /var/log/secure
    • Ubuntu:sudo cat /var/log/auth.log