如何在 crontab 中声明和使用保存管理员用户帐户名称的变量?

如何在 crontab 中声明和使用保存管理员用户帐户名称的变量?

我希望 crontab 是root不可知的,即我不想在其中逐字指定 admin 用户是jim。这就是为什么在我的 crontab 中root引入了变量au

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

au=$(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')

5 */4 * * * /home/"${au}"/sync-w-oumaima.sh
* * * * * echo "$au">"/home/${au}/${au}.log"

遗憾的是,它不起作用——/home/jim/jim.log不是由 crontab 创建的。如何在 crontab 中声明和使用保存管理员用户帐户名称的变量?

答案1

crontab格式允许您定义环境变量,但不执行任何替换。在您的示例中,au变量定义为细绳 $(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')

最简单的解决方案是在 crontab 中显式定义用户:

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

au=jim

5 */4 * * * /home/"${au}"/sync-w-oumaima.sh
* * * * * echo "$au">"/home/${au}/${au}.log"

另一个解决方案是编写一个简单的脚本来设置au变量并运行“真实”命令并从 crontab 运行该脚本:

#!/bin/bash
export au=$(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')
/home/"${au}"/sync-w-oumaima.sh

第三种解决方案是使用evalshell 内置命令让 shell 重新解释au变量的内容,例如:

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

au=$(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')

5 */4 * * * eval /home/"${au}"/sync-w-oumaima.sh
* * * * * eval echo "$au" \> "/home/${au}/${au}.log"

但你必须是额外的小心所需的转义(我当然不小心)。

答案2

首先,改进查找(admin用户)的命令au

# Test with
sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf
# When this looks fine
au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf)

您可以在 crontab 中使用它

5 */4 * * * au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf) && /home/"${au}"/sync-w-oumaima.sh
* * * * * au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf) && echo "$au">"/home/${au}/${au}.log"

当您需要滚动查看命令时,您的命令太长。当你有更多相似的线条时,它就会变得一团糟。为什么不创建/usr/local/bin/get_admin_user

# When this file is sourced (with a dot), the settings will remain available
export au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf)

接下来,在 crontab 中获取此文件

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

get_au="/usr/local/bin/get_admin_user"

5 */4 * * * . ${get_au} && /home/"${au}"/sync-w-oumaima.sh
*  *  * * * . ${get_au} && echo "$au">"/home/${au}/${au}.log"

相关内容