bash脚本中sudo清空Docker日志仍提示Permission denied问题求助
问题根因
你遇到的权限报错本质是shell重定向的执行优先级高于sudo命令:
你编写的sudo :> $DOCKER_LOG_PATH语句中,shell会先以当前执行脚本的普通用户身份,尝试打开$DOCKER_LOG_PATH文件用于写入重定向,完成这一步后才会将前面的:命令提升为root权限执行。Docker日志路径默认仅root用户有写入权限,因此普通用户执行重定向打开文件的步骤就会触发Permission denied错误,sudo的提权效果根本没有生效。
而你测试可行的sudo -s流程,是先启动了一个root身份的子shell,后续在该子shell内执行的重定向操作默认就是root权限,因此可以正常写入。
可行解决方案
以下方案均可直接替换你原有代码中的sudo :> $DOCKER_LOG_PATH行:
- 方案1:通过sudo启动子shell执行完整逻辑,将重定向操作纳入root权限的执行范围
如果路径包含特殊字符,建议给变量包裹双引号避免解析错误:sudo sh -c ": > $DOCKER_LOG_PATH"sudo sh -c ": > \"$DOCKER_LOG_PATH\"" - 方案2:通过提权tee命令实现文件写入
该方案中tee命令被sudo提权,因此有权限写入Docker日志路径,末尾的: | sudo tee "$DOCKER_LOG_PATH" > /dev/null> /dev/null用于屏蔽tee的默认标准输出。 - 方案3:使用truncate命令直接清空文件,可读性更高
sudo truncate -s 0 "$DOCKER_LOG_PATH"-s 0参数表示将文件大小截断为0,等价于清空文件内容。
内容的提问来源于stack exchange,提问作者Killian Fortman
相关产品推荐
相关产品推荐

