You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在脚本中通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:37:15