这是在 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 答案。