2014-12-03 43 views
2

我想写一个非常简单的脚本来检查iptables是否已经更新为Synergy工作。当前的脚本是:如果声明变量比较不工作在bash shell

if [[ $SYNERGY = "yes" ]] 
then 
    echo "Synergy is active" 
else 
    sudo iptables -I INPUT -p tcp --dport 24800 -j ACCEPT 
    export SYNERGY=yes 
fi 

但它不工作
我也试图与这个修改后的版本(我一直在我打开一个新的终端,每次问须藤密码),但结果是相同

syn="yes" 
if [ "$SYNERGY" = "$syn" ] 
then 
    echo "Synergy is active" 
else 
    sudo iptables -I INPUT -p tcp --dport 24800 -j ACCEPT 
    export SYNERGY=yes 
fi 

问题在哪里?

+0

SYNERGY变量是如何设置的? – anubhava 2014-12-03 14:10:55

+0

它可能会要求root密码执行命令'sudo iptables -I INPUT -p tcp --dport 24800 -j ACCEPT' – RBH 2014-12-03 14:11:09

+0

@anubhava变量SYNERGY在else语句的export命令中设置 – sthor69 2014-12-03 16:07:59

回答

3

如果您希望从一个终端/ shell会话运行并影响其他不相关的终端/ shell会话,那么问题是这不是export的工作方式。

export在当前进程的环境中设置变量,以便从此进程派生的任何进程也将其放入其环境中。请注意我是如何说“从...诞生”的?它仅适用于处理派生的进程。不相关的流程不受影响。

如果你想要全局检查的东西,那么你需要某种标志/锁/状态文件或者iptables配置的实际运行时检查。

+0

我的第一次尝试就是检查iptables,但很快我就明白这是解决问题的错误方法,至于检查iptables我需要root和I每次我打开一个新终端时,都会再次检查密码。你有什么建议找到一个简单的解决方案?正如你所理解的,我在linux脚本中没有太多的工作 – sthor69 2014-12-03 16:17:46

+0

@ sthor69为什么你需要经常这样做?你能不能把这个设置为系统的正常配置,并用它来完成?正如我在我的回答中所说的,您可以使用标志/锁定/状态文件而不是导出的变量进行检查(但是,您还需要确保在适当时清理文件)。 – 2014-12-03 16:22:08

+0

正如我所说我是一个linux脚本新手,所以我想找到一个解决方案与文件,我不知道如何管理标志和状态。在开始工作之前,我尝试了另一种似乎可行的解决方案,将iptables命令放在/ etc/profile中。这个解决方案有什么缺点吗? – sthor69 2014-12-03 16:35:38

0

只是为了帮助那些谁拥有了同样的问题,这是我如何设法坚持防火墙设置:

sudo apt-get install iptables-presistent 

,然后在文件中指定的规则rules.v4或rules.v6在/ etc/iptables在启动时自动加载