Ubuntu 18.04下使用Python3调用date命令设置系统时间失败如何解决?
解决方案
你的实现方向没有问题,执行失败的核心原因是sudo命令默认需要交互式输入密码,Python调用subprocess时默认不会接管终端输入,因此权限验证失败导致命令无法执行;无sudo前缀时普通用户默认没有修改系统时间的权限,自然会报错。
可行方案
方案1:配置sudo免密执行date命令(最推荐,生产环境可用)
操作步骤:- 终端执行
sudo visudo打开sudo规则编辑界面(visudo会自动校验语法,避免写错规则导致sudo无法使用,不要直接修改/etc/sudoers文件) - 在文件末尾添加如下内容,替换
你的用户名为实际登录的用户名:
你的用户名 ALL=(ALL) NOPASSWD: /bin/date- 按
Ctrl+O保存,按Enter确认文件名,再按Ctrl+X退出编辑 - 终端执行
which date确认date命令路径为/bin/date,如果路径不同,替换上面配置里的路径即可
配置完成后你原来的subprocess代码就可以正常运行,不需要修改代码。
- 终端执行
方案2:给Python脚本授予root运行权限
直接以root身份运行Python脚本即可,不需要修改代码:sudo python3 你的脚本名.py如果是作为系统服务运行,在systemd配置文件中设置
User=root即可。方案3:subprocess传入sudo密码(仅测试用,不推荐生产环境使用)
可以通过subprocess的stdin把sudo密码传入,缺点是密码会明文写在代码中,有极大安全风险:import subprocess sudo_password = "你的sudo密码" # currenttime格式需符合 "YYYY-MM-DD HH:MM:SS" result = subprocess.run( ["sudo", "-S", "date", "-s", currenttime], input=f"{sudo_password}\n".encode("utf-8"), capture_output=True ) # 可以通过result.returncode判断是否执行成功,0为成功
额外注意事项
- 传入的
currenttime必须和date -s要求的格式一致,推荐统一使用%Y-%m-%d %H:%M:%S格式的字符串 - Python3.5及以上版本更推荐使用
subprocess.run而非Popen,可以更方便的获取执行结果和返回值
内容的提问来源于stack exchange,提问作者최용근
相关产品推荐
相关产品推荐

