我想为技术用户自动添加行到crontab.我不知道密码,所以唯一的方法就是使用sudo-u用户.我编写了以下循环,但它为我登录的用户更新了crontag,而不是为我在sudo命令中提供的用户更新.你能告诉我我做错了什么吗?

for i in $(cat users.txt); do
    sudo -u USERNAME_$i echo "$(echo '* 1 * * * some_command_2' ; crontab -l 2>&1)" | crontab 
done

编辑:我在上面的代码中犯了一个错误,现在它是正确的,但它不工作

推荐答案

让我们来判断一下代码.

for i in $(cat users.txt); do
    sudo -u USERNAME_$i echo "$(echo '* 1 * * * some_command_2' ; crontab -l 2>&1)" | crontab 
done

第一个是sudo.您将以超级用户身份执行第一个echo.你的bash将首先决定需要给sudo提供什么论点.最后一个参数是"$(echo '* 1 * * * some_command_2' ; crontab -l 2>&1)",您自己的用户ID下的shell 将在将其作为参数提供给sudo之前对其进行扩展.如果你加上id,你就可以很容易地看到这一点.

sudo echo "$(echo '* 1 * * * some_command_2' ; crontab -l 2>&1 ; id)"

这将显示id是在您自己的ID下执行的.

下一个可能的问题是您的用户ID列表中的users.txt个.sudo获得的所有用户都以USERNAME_为前缀.这不太可能(尽管有可能)是你想要的.

第三个问题是第二个crontab.这也是在您自己的用户ID下执行的,从而将所有的Stuf添加到您自己的crontag中.这也不是你想要的.

大约sudo:sudo does not以新用户的身份运行该行的其余部分,只运行紧随其后的命令.

那么,如何解决这一问题呢?

go 掉无用的echo,sudo必须做的用crontab -u.

所以这大概是这样的:

for name in $(cat users.txt); do
    (echo '* 1 * * * some_command_2' ; sudo crontab -lu "$name") | sudo crontab -u "$name" 
done

这可能会奏效.

Linux相关问答推荐

awk:try 将时间戳字符串转换为unix纪元时间

使用信号处理程序实现Hibernate 功能

重命名具有相同前缀的文件对中最旧的文件

在 Bash 中使用 shell 脚本从文件中解析版本号

使用 YASM 程序集时如何更改 64 位 Linux 中的终端 colored颜色 ?

仅查找并保留有效邮箱并删除无效记录,AWK

如何使用 gdb 调试堆栈分段错误?

读取命令停止执行 bash 脚本

$RANDOM 变量在输出通过管道后似乎没有改变

PHP factor 30 从 Linux 到 Windows 的性能差异

如何使用 GDB 和 QEMU 调试 Linux 内核?

如何将整个文件夹从 Amazon EC2 Linux 实例复制到本地 Linux 机器?

使用特定目录作为根目录压缩目录的命令

'&&' 与 '&' 与 Bash 中的 'test' 命令

Docker Volume 没有挂载任何文件

Linux 配置/制作,--prefix?

Linux AMD64 中如何使用 fs/gs 寄存器?

如果关键字触发然后执行命令,Shell 脚本来监视日志(log)文件?

如何从 Linux 终端找到特定文件?

如何编写 Mono 守护程序