我在 Linux 和 bash 领域相对“初学者”,我无法弄清楚这一点。
除此之外,如果“字符串”不存在,我想修改 iptables,但它似乎不起作用。不确定这是否是因为 if 语句、退出代码、语法或 sudo 权限或其他原因。
当脚本通过 cron 自动运行时,if
即使iptables
包含我正在查找的字符串,它也会执行该子句。这是通过验证
- 在终端中打印预定运行前后的秒数
echo "this" >>/log/file.log
通过在 if 子句中添加一个。
取1:
#!/bin/bash
iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then
command-to-perform
fi
取2:
#!/bin/bash
iptablesvar=$(iptables -L -v -n)
if [[ $iptablesvar != *"8.8.8.8"* ]]; then
command-to-perform
fi
我已经尝试过这两种方法,由 (sudo) crontab 使用以下行触发:
*/1 * * * * /bin/bash /home/username/path/to/script-file.sh
让我感到困惑的是,当直接输入终端时,上面的两个选项似乎都有效,如下所示:
sudo iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then echo "not found" ;fi
if [ $? == 0 ]; then echo "found" ;fi
var=$(sudo iptables -L -n -v)
if [[ $var != *"8.8.8.8"* ]]; then echo "n" ;fi
if [[ $var == *"8.8.8.8"* ]]; then echo "y" ;fi
是什么赋予了?
如果相关的话,我的系统是新的 Linux Mint 19.3 Tricia
答案1
那么我自己来回答这个问题 - 所有学分@steeldriver的评论:
iptables
不在 cron 中PATH
。更改命令以包含完整路径/sbin/iptables
。