如何在脚本中通过sudo为其他用户修改crontab?执行异常求助
批量修改指定用户crontab失败的问题排查与解决
问题描述
希望实现为技术用户自动添加crontab任务的自动化操作。由于不知道这些用户的密码,只能通过
sudo -u USER的方式操作。编写了如下循环脚本,但它仅修改了当前登录用户的crontab,而非sudo指定的目标用户,请问哪里操作有误?
用户提供的脚本:
for i in $(cat users.txt); do sudo -u USERNAME_$i echo "$(echo '* 1 * * * some_command_2' ; crontab -l 2>&1)" | crontab done
错误原因分析
- 权限上下文不匹配:
$(...)里的crontab -l是在当前用户环境下执行的,不是目标用户的。sudo只给前面的echo命令加了权限,后面的子shell和管道后的crontab还是用当前用户身份跑,自然改的是当前用户的任务。 - 未指定目标用户执行crontab:就算前面拿到了目标用户的crontab内容,最后的
crontab命令不带任何参数时,默认操作的是当前用户的任务列表,不会作用到目标用户。
修正后的脚本
方案一:临时文件方式(更直观)
for i in $(cat users.txt); do sudo -u "USERNAME_$i" bash -c ' # 写入新任务到临时文件 echo "* 1 * * * some_command_2" > /tmp/crontab_temp_$USER # 追加原有任务(如果存在),忽略无任务的报错 crontab -l 2>/dev/null >> /tmp/crontab_temp_$USER # 应用新的crontab配置 crontab /tmp/crontab_temp_$USER # 删除临时文件 rm -f /tmp/crontab_temp_$USER ' done
方案二:管道方式(更简洁)
for i in $(cat users.txt); do # 在目标用户上下文里输出新任务+原有任务,再通过sudo传给目标用户的crontab sudo -u "USERNAME_$i" bash -c 'echo "* 1 * * * some_command_2"; crontab -l 2>/dev/null' | sudo -u "USERNAME_$i" crontab - done
修正说明
- 用
sudo -u USER bash -c '...'把整个操作逻辑包裹起来,确保所有命令(包括crontab -l)都在目标用户的权限下执行。 - 最后的
crontab命令同样通过sudo -u USER调用,明确指定修改目标用户的任务列表。 - 加入
2>/dev/null处理用户没有原有crontab任务时的报错,避免输出干扰。
内容的提问来源于stack exchange,提问作者Lucifer
相关产品推荐
相关产品推荐

