如何使用 crontab 以 nobody 身份运行脚本

如何使用 crontab 以 nobody 身份运行脚本

这是在 CentOS 机器上。我尝试在每天的某个时间以用户 nobody(或具有最低权限的用户)的身份运行脚本。以下是 nobody:

[root@CentOS % ~] grep "^nobody" /etc/passwd  
nobody:x:99:99:Nobody:/:/sbin/nologin  

这是我在 root 的 crontab 中尝试过的:

设置环境变量 SUDO_USER=nobody
15 17 * * * sudo -u nobody /bin/bash /usr/local/bin/bashscript.sh
15 17 * * * su -c /usr/local/bin/bashscript.sh nobody

如果可能的话,我希望将 crontab 条目保留在 root 的 crontab 中。我也不想欺骗用户 nobody 的帐户,因为我不想破坏可能依赖这些设置的任何其他东西。如果这是症结所在,我并不反对创建另一个非特权帐户并为他们提供真正的 shell。

我也承认我有点困惑。我以为这是一个每天都会遇到的问题,只是我的谷歌功夫棕带帮不上什么忙。

答案1

crontab -e我猜你正在发布或的内容crontab -l

这是属于用户“root”的crontab文件,该文件不支持指定用户以该命令运行(因为它通常是用于调度的文件)个人的作业)。
看看/etc/crontab哪个是系统范围的 crontab,并且有一个附加字段:用户字段。尝试添加如下一行/etc/crontab

15 17 * * * nobody /usr/local/bin/bashscript.sh

答案2

su --shell=/bin/bash --session-command="/path/to/command -argument=something" 用户名 &

对我来说是可行的,即使用户没有有效的登录 shell,也不会抛出“此帐户当前不可用。”错误

答案3

实际上爪勺引导我找到答案,但让我创建自己的更完整的答案,以便它能够浮到顶部。

我不知道它有多普遍,但一些在线 Ubuntu 文档说 /etc/crontab 可以在升级时被覆盖,首选解决方案是创建一个名为 /etc/cron.d/anything 的文件(其中任何东西都可以是任何东西。任何文件名)

我创建了一个名为 /etc/cron.d/nobody 的文件,并将脚本以非特权用户身份运行。示例行:

# run the following every day at 01:02 AM
02 01 *  *  *  nobody /usr/local/bin/script-to-run-as-nobody.sh

我在 root 的 crontab 中加入了一条注释,以便其他人可以遵循,因为日常的 crontab 任务目前都是从那里运行的。这并不是最佳做法。

此外,出于测试目的,我需要首先通过命令行运行该作业。由于我有 sudo 权限,因此我使用:

$ sudo -u root sudo -u nobody /usr/local/bin/script-to-run-as-nobody.sh

如果该脚本需要输出到/dev/stderr或者/dev/stdout,然后执行以下操作:

$ chmod o+w /dev/ttyp1

并执行以下操作:

$ chmod o-w /dev/ttyp1 

当你完成测试时,为了防止任何人向你的终端屏幕发送垃圾邮件。(你使用的实际终端可能与/dev/tty1,所以$ ls -ltr /dev/tty*|grep 用户名找出哪一个是你的)。

答案4

解决方法 #2

您可以在 /etc/passwd 中创建一个具有登录 shell 的非特权用户

比如,创建一个名为“someone”的用户,拒绝他们使用 sudo,但给他们一个 shell

然后下面的操作应该可以在root的crontab中运行:

15 1  *  *  *  su -c /usr/local/bin/bashscript.sh somebody

不过,我更喜欢 clawspoon 的 /etc/crontab 答案。

相关内容