Shell Script on Linux

前陣子用linux shell script寫了module自動deploy機制。紀錄一下這之中遇到的問題及常用的指令。
簡單的自動deploy不外乎就是將檔案傳送至遠端機器然後進行安裝動作,修改設定檔。

  • login to remote server

由於原生shell script裡面無法自動輸入帳密進行登錄動作,基本上常用的方法有兩種。
第一種方法就是建立ssh public key然後放在遠端機器上,這樣你ssh時就不需要再輸入密碼。 第二種方法是安裝其它套件協助自動輸入密碼。在這裡我介紹的是使用sshpass。 安裝完後要記得自己先手動登入一次遠端機器,不然它不會作用。接下來你要登入遠端機器的指令就如下

1
sshpass -p {your password} ssh root@{remote ip} "echo 'hello world'"

這樣就可以登入遠端機器並輸出一個hello world。

另外你也可以用scp來拷貝資料過去

1
sshpass -p {your password} scp data.zip root@{remote ip}:/home/root/

這樣就可以把data.zip丟到遠端/home/root/目錄

  • execute command on remote server

    簡單地方法就是在sshpass之後帶入command

1
sshpass -p {your password} ssh root@{remote ip} "mkdir myFolder;rm myFile.txt"

這樣就可以在登入後執行mkdir及rm兩個指令。 另一種方法就是把你要執行的指令寫成一個shell script,然後scp過去後執行。例如我把這兩行指令寫在myScript.sh裡

1
2
3
#!/bin/bash
mkdir myFolder
rm myFile.txt

然後執行底下指令

1
2
sshpass -p {your password} scp myScript.sh root@{remote ip}:/home/root/
sshpass -p {your password} ssh root@{remote ip} "/home/root/myScript.sh"
  • retrieve the specified string from a line

    例如我有一個my.xml檔裡面紀錄了最新的版號如下

1
2
3
<myxml>
  <release>1.0.22</release>
</myxml>

用底下的指令來取出版號

1
latest=$(cat my.xml | sed -n 's/.*<release>\(.*\)<\/release>/\1/p')

由於(, ), /是特殊字元,所以在re裡前面都要加上\
後面的\1表示要取result的第一個group。
整個用$()包覆是因為要把執行結果放進latest這個變數。

  • replace string in a config file

    使用sed指令加上regular expression

1
sed -i 's/.*MyTest.*/YourTest/' config.txt

這樣就可以把config.txt裡面所有字串裡中間有MyTest替換成YourTest

  • insert a new line in a config file

    使用sed指令加上regular expression

1
sed -i 's/.*MyTest.*/&\nYourTest/g' config.txt

這樣就可以在config.txt裡面插入新的一行YourTest在每一行符合中間有MyTest的字串。

Comments