任意のユーザーから/etc/cron.daily/my
を実行することは不可能であり、/etc/crontab
に従ってroot
からのみ実行されることを適切に理解していますか?
代わりにcron scripで特定のユーザーにルート権限をドロップできますか?
Cronジョブを/etc/cron.d
に配置することをお勧めしますか?好む:
$ cat /etc/cron.d/my
5 0 * * * user test -x /usr/bin/my && /usr/bin/my -cfg /etc/my.cfg
あなたは正しい、/etc/cron.daily
(および毎週/毎月など)のジョブは常にユーザーroot
として実行されますが、スクリプト内からユーザーを単純に切り替えて、そのスクリプトをそのように再度呼び出すことができます提供されたすべての引数を含む他のユーザー(cron.daily
ジョブには含まれません):
ファイル/etc/cron.daily/my
:
#!/bin/sh
# If started as root, then re-start as user "gavenkoa":
if [ "$(id -u)" -eq 0 ]; then
exec Sudo -H -u gavenkoa $0 "$@"
echo "This is never reached.";
fi
echo "This runs as user $(id -un)";
# prints "gavenkoa"
exit 0;
ユーザーroot
としてスクリプトが開始されると、Sudo -H -u gavenkoa
を介してそれ自体を検出し、再実行します。つまり、ユーザーgavenkoa
として。 root
は常にすべてのユーザーに切り替えることができるため、/etc/sudoers
に特別なエントリは必要ありません。
exec
replacesは、新しいSudo …
呼び出しで現在のプロセスを返し、戻りません。そのため、else
句は必要ありません。