Python操作/var/log日志文件出现PermissionError与FileNotFoundError求解
问题根因
你遇到的两个报错属于两个独立的逻辑/权限问题:
- 不添加
os.chmod时报PermissionError:Linux系统的/var/log是系统级日志目录,默认所有者为root,权限为drwxr-xr-x,普通用户仅拥有读和目录进入权限,没有写入权限,无法在目录下新建文件,因此调用open()的追加模式时触发权限拒绝。 - 添加
os.chmod时报FileNotFoundError:你的代码执行顺序错误,调用os.chmod时日志文件还没有被创建,自然找不到目标文件来修改权限。
另外你开头检查并创建/var/log的代码没有实际作用,几乎所有Linux发行版默认都会存在该目录,且普通用户也没有权限创建/var下的一级目录。
可行解决方案
方案1:使用用户级日志目录(最推荐)
不要强行写入系统级的/var/log目录,改用当前用户拥有完全权限的用户级目录存放日志,无需额外权限配置,安全性最高,代码示例如下:
import os log_dir = os.path.expanduser("~/.local/share/s3_sync/logs/") log_filepath = os.path.join(log_dir, "s3_sync.log") # 递归创建日志目录,已存在时不会报错 os.makedirs(log_dir, exist_ok=True) # 直接打开写入即可 with open(log_filepath, "a") as f_log_in: # 写日志的业务逻辑 pass
方案2:必须写入/var/log时,提前手动配置日志文件权限
如果业务要求必须存放在/var/log下,推荐提前用root账号创建日志文件并配置对应权限,不需要给程序额外高权限,操作命令如下:
# 创建空日志文件 touch /var/log/s3_sync.log # 把文件所有者改为运行你Python程序的用户和用户组 chown your_user_name:your_group_name /var/log/s3_sync.log # 配置合理的日志文件权限(所有者可读写,其他用户仅可读,禁止全局可写) chmod 644 /var/log/s3_sync.log
配置完成后你的代码不需要保留os.chmod逻辑,直接打开文件写入即可。
方案3:临时测试用sudo提权运行
如果只是本地临时测试,可以用sudo给程序授予root权限运行:
sudo python3 your_script.py
该方案有较高安全风险,禁止在生产环境使用。
方案4:调整代码逻辑(仅程序有root权限时生效)
如果你的程序本身就需要以root权限运行,可以调整代码执行顺序,先创建文件再修改权限,注意不要给日志文件开全局可写权限,避免日志被恶意篡改:
import os import stat log_filepath = "/var/log/s3_sync.log" # 先打开文件,a模式会自动创建不存在的文件 with open(log_filepath, "a") as f_log_in: # 文件创建完成后再修改权限 os.chmod(log_filepath, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) # 写日志的业务逻辑 pass
内容的提问来源于stack exchange,提问作者winterlyrock
相关产品推荐
相关产品推荐

