使用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
相关产品推荐
相关产品推荐

