crontab执行含sudo docker命令的bash脚本提示权限被拒绝如何解决?
报错根因
- 手动执行脚本时需要输入sudo密码,而crontab是无交互运行环境,无法输入sudo密码触发权限报错
- 脚本中
docker exec加了-it参数,要求分配交互式终端,crontab运行时没有对应终端环境也会导致执行失败
可选解决方案
方案一:配置特定sudo命令免密(安全性最高,推荐)
- 先执行
which docker获取docker命令的绝对路径,默认一般为/usr/bin/docker - 执行
sudo visudo编辑sudo权限配置文件(该命令自带语法校验,避免写错文件导致sudo失效),在文件末尾添加以下内容,替换你的用户名为你当前执行crontab的用户名:
你的用户名 ALL=(ALL) NOPASSWD: /usr/bin/docker exec example-app psql *
- 修改你的bash脚本,删除
docker exec后的-it参数,修改后对应行如下:
sudo docker exec example-app psql -U $PG_USERNAME $PG_DB \ -c "DELETE from users where created_at <= current_date at time zone 'UTC' - interval '7 days' and is_activated = false;" \ && echo "Users removed!" \ || echo "failed to run command"
- 保存脚本后即可正常通过crontab执行。
方案二:将用户加入docker组,无需sudo即可执行docker命令
- 执行以下命令将当前用户加入docker用户组:
sudo usermod -aG docker $USER
- 重启crontab服务使权限生效(不同发行版命令略有区别):
# Debian/Ubuntu系 sudo systemctl restart cron # CentOS/RHEL系 sudo systemctl restart crond
- 删除脚本中
docker命令前的sudo,同时删除-it参数即可。
方案三:使用root身份运行定时任务(不推荐,仅临时测试用)
直接执行sudo crontab -e编辑root用户的定时规则,原有定时配置不变,删除脚本中docker命令前的sudo和-it参数即可,root用户默认具备docker操作权限。
额外注意事项
- 建议在脚本开头添加shebang行
#!/bin/bash,避免crontab默认使用sh执行出现语法兼容问题 - 可以将脚本中所有命令替换为绝对路径,避免crontab的PATH环境变量不全导致找不到命令的问题
- 你之前修改脚本所有者为root的操作不需要保留,改回对应用户所有即可,只要执行用户具备脚本的执行权限就可以正常运行
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

