设置执行 chmod/chown 的 cron 作业

tvg*_*ert 11 permissions mac-osx-server cron

我想设置一个 cron 作业,它在目录(保管箱目录)上递归地执行 chmod/chown。

这在我手动执行命令时有效,例如:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox
Run Code Online (Sandbox Code Playgroud)

我试图将其转换为这样的 cron 作业:

10      *       *       *       *       sudo chown -R $USER ~/Dropbox
Run Code Online (Sandbox Code Playgroud)

但它似乎并没有完成这项工作。

这该怎么做?

vor*_*aq7 17

sudo应该几乎 从来没有在计划任务中使用。它希望能够与终端通信,并需要特定的标志来避免尝试这样做。

以 root 身份创建您的 cron 作业(在/etc/crontab- 请注意,此文件的格式略有不同 :)。 这也有利于在未安装的系统上工作。minute hour mday month wdayusercommand
sudo

  • @tvgemert David 上面(以及在他的回答中)关于路径/相对路径/符号路径(`~`)所说的内容是***重要的***——请花一些时间阅读 cron 和 crontab 手册页,并确保您了解正在发生的事情(如果有疑问,请创建一个 cron 作业,该作业执行`echo“您想要做的事情”> /tmp/what-i-would-run` 并查看结果以确保它们是理智的 - - 毁灭宇宙的可能性要小得多。) (5认同)
  • `somename` 可以在任何地方;它是一个相对路径。其次,`~` 只能被shell 理解;使用`$HOME`。使用这样的命令:`chown -R /some/path/somename $HOME/Dropbox`(这将使用 `root` 的主目录......) (3认同)

dr *_*bob 11

您希望您的根 cron 脚本(通过运行编辑sudo crontab -e)为:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox
Run Code Online (Sandbox Code Playgroud)

假设用户已命名somename并且这/home/somename/Dropbox是您的 Dropbox 目录的完整路径。作为 root 用户, ~ 转到/root.

  • 伟大的; 很高兴它的工作。教训是 (a) 不要期望像 `$PATH` 这样的环境变量被定义为等同于 cronjob 中登录用户的那些变量(例如,在我的 linuxbox 上定义了 $HOME,但 $PATH 被设置为 `/来自 crontab 和 $USER 的 usr/bin` 和 `/bin` 未定义;因此在这种情况下,您不需要在 chmod/chown 之前指定 `/bin`),(b)避免在脚本中使用 `sudo`(运行cron 任务作为 `root` 用户),(c)作为 root 用户 `$HOME` 将引用 /root 而不是你的普通用户,(d)在 cron 脚本中应该避免使用 `~`(默认情况下以 `#!/垃圾箱/sh`。 (2认同)

pjc*_*c50 6

两个问题:

1) 通常在 cron 中设置路径的方式与您登录时的设置方式不同。尝试 /usr/bin/sudo /bin/chown ...(或系统上这些程序的任何正确路径)。

2) sudo 通常会询问您的密码,否则可能无法以非交互方式运行。我建议您将命令放在 root 的 crontab 中而不使用 sudo,然后命令以 root 身份运行。


Mei*_*Mei 6

您的 crontab 存在多个问题:

10 * * * sudo chown -R $USER ~/Dropbox
Run Code Online (Sandbox Code Playgroud)

问题:

  • sudo不应在这里使用;它需要终端输入
  • chown应该完全指定(即,/bin/chown
  • USER因为实际变量可能不存在;一些系统使用LOGNAME
  • ~(波浪号) 只会被外壳识别 - 裸机chown不会理解它
  • 在 root 的 crontab 中指定 HOME 转到 root 的家

我想我实际上会编写它:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox
Run Code Online (Sandbox Code Playgroud)

(该eval需要转换~$1~user 然后/home/user)。

从 root 的 crontab 运行这个脚本:

# root's crontab
10 * * * /usr/local/bin/myscript someuser
Run Code Online (Sandbox Code Playgroud)