Windows运行Python脚本设置Linux Samba共享文件权限无效的解决方法
解决Windows环境下Python脚本设置Samba共享(Linux后端)文件权限问题
问题背景
在Windows上运行Python脚本,将数据写入挂载为Samba驱动器的Linux文件共享目录,使用os.chmod()尝试设置rwxrwxrwx(777)权限,但实际结果是rw-rw----,权限设置失效。
核心原因
Windows的os.chmod()与Linux权限模型不兼容,Samba共享的权限控制主要由Samba服务器端配置和文件创建时的继承权限决定,Windows端直接调用os.chmod()无法绕过Samba的权限映射规则。
可行解决方案
方案1:修改Samba服务器配置(推荐)
在Linux的Samba配置文件(通常为/etc/samba/smb.conf)中,针对目标共享目录调整权限参数:
create mask = 0777:控制新创建文件的默认权限directory mask = 0777:控制新创建目录的默认权限force create mode = 0777:强制覆盖客户端传递的权限位force directory mode = 0777:强制目录权限
示例配置片段:
[pv_compliance] path = /other/pv_compliance writable = yes create mask = 0777 directory mask = 0777 force create mode = 0777 force directory mode = 0777
修改后重启Samba服务(systemctl restart smbd),后续创建的文件会自动应用777权限。
方案2:通过Python调用Linux命令(需SSH访问权限)
若无法修改Samba配置,可在Python脚本中通过SSH连接Linux服务器,直接执行chmod命令:
- 安装
paramiko库:pip install paramiko - 编写执行代码:
import paramiko def set_linux_file_permission(host, username, password, remote_path, permission): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(host, username=username, password=password) command = f"chmod {permission} {remote_path}" stdin, stdout, stderr = ssh.exec_command(command) error = stderr.read().decode() if error: raise Exception(f"权限设置失败:{error}") finally: ssh.close() # 调用逻辑 try: df_adverse_events.to_csv(file_path_csv_ae) df_ingredients.to_csv(file_path_csv_ing) # 替换为Linux服务器上的实际路径 remote_ae_path = "/other/pv_compliance/adverse_events.csv" remote_ing_path = "/other/pv_compliance/active_ingredients.csv" set_linux_file_permission("samba.scp.mycompany.net", "your_linux_user", "your_password", remote_ae_path, "777") set_linux_file_permission("samba.scp.mycompany.net", "your_linux_user", "your_password", remote_ing_path, "777") except Exception as e: log_event(log_file, f"Error: {e}") sys.exit(0)
方案3:使用Windows的icacls命令(权限映射方式)
若不需要严格匹配Linux权限,可通过Windows的icacls命令设置共享目录的Windows权限,由Samba自动映射为Linux权限:
import subprocess def set_windows_permission(file_path): # 给所有用户设置完全控制权限 command = f'icacls "{file_path}" /grant Everyone:F /T' result = subprocess.run(command, shell=True, capture_output=True, text=True) if result.returncode != 0: raise Exception(f"权限设置失败:{result.stderr}") # 调用逻辑 try: df_adverse_events.to_csv(file_path_csv_ae) df_ingredients.to_csv(file_path_csv_ing) set_windows_permission(file_path_csv_ae) set_windows_permission(file_path_csv_ing) except Exception as e: log_event(log_file, f"Error: {e}") sys.exit(0)
注意:这种方式的权限映射依赖Samba的acl map full control配置,可能无法完全对应Linux的777权限。
关键注意事项
- 若使用Windows任务计划运行脚本,确保任务执行账户拥有Samba共享的写入权限及对应操作权限(如SSH登录、执行
icacls的权限) - 避免硬编码密码,可使用环境变量或加密存储方式
内容的提问来源于stack exchange,提问作者smackenzie
相关产品推荐
相关产品推荐

