我希望 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
第三种解决方案是使用eval
shell 内置命令让 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"