You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python通过FTP上传文件时如何保留原文件权限?

问题描述

使用Python的ftplib库上传文件至FTP服务器时,无法保留原文件权限。本地文件权限为:

-rwxrwxrwx 1 user user  56046 Oct 15 16:11 file.elf

上传至服务器后权限变为:

-rw------- 1 root root  56046 Nov 3 13:19 file.elf

当前使用的代码如下:

import os
import ftplib

ftp_session = ftplib.FTP()
connect_status = ftp_session.connect(host=target, port=port)
print(connect_status)

login_status = ftp_session.login(user=user, passwrd=passwrd)
print(login_status)

with open(filename, 'rb') as f:
    transfer_staus = ftp_session.storbinary(f'STOR file.elf', f, blocksize=os.path.getsize(filename))
    print(transfer_staus)
解决方案

FTP协议本身没有原生支持传输文件权限的机制,需要在上传完成后手动设置权限,或者调整服务器配置。

方法1:上传后用SITE CHMOD设置权限

多数Unix/Linux系FTP服务器支持SITE CHMOD命令,可用于修改远程文件权限。具体步骤:

  • 先获取本地文件的八进制权限值(比如-rwxrwxrwx对应777)
  • 文件上传完成后,执行SITE CHMOD命令同步权限

修改后的代码示例:

import os
import ftplib

ftp_session = ftplib.FTP()
connect_status = ftp_session.connect(host=target, port=port)
print(connect_status)

login_status = ftp_session.login(user=user, passwrd=passwrd)
print(login_status)

local_file = "file.elf"
remote_file = "file.elf"

# 获取本地文件的八进制权限(提取最后三位)
local_perm = oct(os.stat(local_file).st_mode)[-3:]

# 上传文件
with open(local_file, 'rb') as f:
    transfer_status = ftp_session.storbinary(f'STOR {remote_file}', f, blocksize=os.path.getsize(local_file))
    print(transfer_status)

# 设置远程文件权限
chmd_result = ftp_session.sendcmd(f'SITE CHMOD {local_perm} {remote_file}')
print(chmd_result)

注意:

  • 若服务器不支持SITE CHMOD,可尝试直接用CHMOD命令(把命令改成f'CHMOD {local_perm} {remote_file}')
  • 确保登录用户拥有修改该文件权限的权限

方法2:调整服务器umask配置

如果所有上传文件的默认权限都是-rw-------,可能是FTP服务器的umask设置导致的。联系服务器管理员调整umask值,可让新上传文件继承更合理的默认权限,但这种方式无法精确保留原文件的自定义权限。

内容的提问来源于stack exchange,提问作者porton1111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:32:55