我需要定期重新启动防火墙,因此我创建了一个 bash 文件将其添加到 CRON 表中。
在终端中,我使用命令重新启动防火墙:
service firewall restart
但如果我的 bash 文件 ( myscript.sh
) 中有类似的行:
#!/bin/sh
service firewall restart
并从终端运行它(以 root 身份)
sh myscript.sh
防火墙未重新启动。
有什么不同?如何从 bash 文件重新启动服务?
编辑
我也尝试过这个命令:
/etc/init.d/firewall stop
/etc/init.d/firewall start
和
/etc/init.d/firewall restart
并且还尝试像这样执行该文件:
/bin/sh myscript.sh
还是行不通。
编辑 我的 bash 脚本看起来像这样:
#!/bin/sh
if [ some statement ]; then
/etc/init.d/firewall restart # also tried: eval /etc/init.d/firewall restart
stat /some/file -c %Y > /root/statfile
# if I add any statement here it is being executed, so it is not the fault of incorrect if statement
fi
答案1
的环境cron
和你随机登录shell的环境不一样。您环境中的某些内容很可能不是您的防火墙脚本所需要的。
尝试检查/var/mail
,或无论您的邮件池是什么。 Cron 默认将输出邮寄给其 crontab 执行某些操作的用户,但如果您尚未配置 MTA,您将看不到该输出。如果您发现的输出没有启发性,请尝试添加set -x
到脚本的顶部,和/或添加命令env
(不带参数),并将输出与从 shell 运行时相同命令的输出进行比较。
如果所有这些都失败了,请发布输出和满的脚本(不要编辑它——仅仅因为您认为一切都很好并不意味着它就是这样,如果您隐瞒信息,您就不能指望获得帮助)。
答案2
你打算做什么some statement
提炼
if [ some statement ]; then ...
这没有道理
答案3
如果你这样做/etc/init.d/firewall restart
而不是呢service firewall restart
?
这可能是路径。
请记住使其可执行:
chmod +x myscript.sh
答案4
必须使用 sudo 调用该脚本。或者通过在 Wheel 管理员组帐户中让另一个用户与 sudo 一起使用。这完全取决于您使用的发行版以及可以使用的选项以及如何使用它们以足够高的权限运行脚本。
sudo -u [username] -S myscript.sh < password_file.txt
使用组帐户进行文件权限时,必须将其包含在脚本文件(myscript.sh)的组权限中,并且位于该组有权访问的目录中。必须使用 -u [usename] 选项通过脚本调用轮子或其他组中的用户。当使用wheel帐户时,我不会使用cron帐户作为用户。您还需要将用户添加到 sudo 列表中。轮组已在某些发行版中被弃用,因为它已被证明存在安全风险。在这种情况下,请创建一个用于管理目的的组,并使用该组来获取文件权限。
可以在此处找到将用户添加到 sudo 列表的说明:https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file-on-ubuntu-and-centos...使用本教程作为指南。
另外,如果您在脚本中包含 stderr 代码和/或将 sdtout 重定向到文本文件,它会让您了解调用脚本时出现的任何问题。
关于 sudo 和安全使用它的方法和技术有很多。这实际上与用户和/或公司的约定和安全策略有关。