2015-07-09 139 views
0

我有一個簡單的bash腳本,其中包含一個名爲servers的關聯數組。服務器名稱是密鑰,IP地址是值。當我想在我的所有服務器上運行某個腳本時,我會使用它。當在ssh上執行腳本時,在bash中設置env變量

for server in ${!servers[@]}; do 
    echo "" 
    echo -e "\e[93mConnecting to $server...\e[0m" 
    ssh [email protected]${servers[$server]} 'sudo /bin/bash -s' < $1 | while read line; do echo -e "\e[92m[$server]\e[0m $line"; done 
done 

當我交互運行它,並從標準輸出讀,但現在我想從cron自動運行,並且具有在服務器上運行有條件地發送數據使用捲曲hipchat腳本這工作得很好。

不幸的是,許多服務器沒有設置有意義的主機名,我無法輕易更改主機名,因爲有幾十年歷史的PHP網站使用主機名來確定它們運行的​​環境並設置數據庫憑證等...我不想爲此審計數十甚至上百個網站。

我可以將$ server的值作爲環境變量發送到服務器上衍生的bash shell,腳本可以在將消息發送到hipchat或電子郵件時使用該環境變量?我試着在/ bin/bash之前做SERVER = $ server,但似乎並不奏效。

+2

本地設置的任何內容都不會影響遠程主機。您需要將其設置在遠程主機的會話中(更具體地說,在「sudo」運行的bash會話中)。你可以用'<(echo「SERVER = $ server」; cat $ 1)'或者其他可能的東西替換'<$ 1'。 –

+0

在$ {!servers [@]}中使用'for server來獲取下標,然後將這個值稱爲'$ {servers [$ server]}'是很奇怪的。一個更直接的方法是'在$ {servers [@]}中的服務器',然後只需引用'$ server'。 – alvits

+0

雖然我正在使用鍵和值。 $ {servers [@]}只會展開爲IP地址列表。如果我以交互方式運行服務器,或者要將服務器的名稱作爲env變量提供給第二個腳本,以便參考其報告,則要輸出服務器的名稱。正如我所說,我不能相信服務器上的主機名值或將它們改爲我可以信任的東西。我寧願輸出一個有意義的名稱而不是IP地址,或者至少與IP地址一起輸出。 – digitaladdictions

回答

0

我想通了。我只需要從調用bash shell的時候刪除單引號。然後添加SERVER = $服務器工作。

for server in ${!servers[@]}; do 
    echo "" 
    echo -e "\e[93mConnecting to $server...\e[0m" 
    ssh [email protected]${servers[$server]} sudo SERVER=$server /bin/bash -s < $1 | while read line; do echo -e "\e[92m[$server]\e[0m $line"; done 
done 
+0

使用雙引號會比沒有引號更好,但是,這是總體思路,請在遠程主機上進行分配。 –