2014-12-03 76 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在啓動時自動加載