【问题标题】:What is the problem with cron privileges?cron 权限有什么问题?
【发布时间】:2020-02-13 18:35:59
【问题描述】:

当我从命令行运行 BASH 脚本时,它会被执行。 当我尝试将其作为 cron 任务运行时,它失败了。通过异常方法,我发现了一个问题。它在于“which iptables”命令返回一个空字符串。我尝试在“/sbin”目录中找到的所有程序都会发生这种情况。 示例:

# crontab -e
* * * * * /root/test.sh >> /root/test.log 2>&1

test.sh

#!/bin/bash
IPT=$(which iptables);
echo ${IPT} >> /root/test.log

但在 test.log 中写入了空字符串。 在 Ubuntu 16.04 和 Debian 8 上测试。

【问题讨论】:

  • 使用IPT=$(/sbin/which iptables);?
  • 在我的操作系统上,命令位于“/usr/bin/which”。我忘了写其他命令,例如“which ps”,在通过 cron 调用时会返回正确的结果。
  • 可能是权限问题。我建议您检查/var/log/cron 以查看任何错误消息。
  • 使用完整路径:1. 防止此类错误 2. 更安全
  • which 正在查找 PATH。 crontab 是每个用户,可以有自己的 PATH 或大部分为空的 PATH

标签: linux bash cron


【解决方案1】:

与权限无关。

which$PATH 中查找命令。 cron 脚本的路径有限,不包括 iptables,因此找不到。

 $ /usr/bin/which iptables
/sbin/iptables
 $ PATH=/bin:/usr/bin /usr/bin/which iptables
 $ echo $?
1

当您的路径有限时,它将返回一个空字符串(在我的另一台机器上,它报告 (/usr/bin:/bin) 所以 YMMV 中没有 iptables)并以非零代码退出。

如果您执行echo $PATH >> /root/test.log 之类的操作,您将看到cron 的路径只有/usr/bin/bin

您必须将$PATH 设置为包含iptables 位置,或者在调用iptables 时使用完整路径

【讨论】:

  • 感谢您的回复。实际上,“”中缺少目录“”。但我确信“”命令是用来搜索程序的。否则,更容易明确指定路径。
  • @RomanSokolov 嘿,这解决了你的问题吗?如果是,请查看What should I do when someone answers my question?
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2012-03-16
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多