xshell腳本編寫
① 如何遠程通過Xshell實現對linux主機的開、關機及重啟
關機的情況無法遠程開機,關機命令shutdown,重啟命令reboot,使用步驟如下:
1、連接上相應的linux主機,進入到等待輸入shell指令的linux命令行狀態下。
② xshell 登陸後執行vbs腳本
centos系統
1. 查看是否有這個安裝包
[root@02 tmp]# rpm -qa |grep coreutils
coreutils-libs-8.4-19.el6_4.1.x86_64
2. 如沒有請安裝
[root@02 tmp]# yum install coreutils
3. 使用:如腳本 for.sh
[root@02 ~]# nohup sh for.sh
③ 1.構建JS登錄腳本
在編寫xshell腳本的過程中用到最多的就是自動輸入,自動捕獲,延時等語句
自動輸入
以自動輸入xyz為例
自動輸入的語句:xsh.Screen.Send("xyz");
當然,如果你輸入的是一條命令,還需要下面這一行輸入回車
輸入回車的語句:xsh.Screen.Send(String.fromCharCode(13));
自動捕獲
以linux系統為例,一般程序執行的列印數據位於倒數第二行,如下圖所示
/* 字元串處理 */
var ScreenRow, ReadLine, Items;
/* 讀取倒數第二行,長度為40個字元 */
ScreenRow = xsh.Screen.CurrentRow - 1;
ReadLine = xsh.Screen.Get(ScreenRow, 1, ScreenRow, 40);
延時
以等待1s為例
延時語句:xsh.Session.Sleep(1000);
其他
打開新會話:xsh.Session.Open(string);
對話框提醒:xsh.Dialog.MsgBox(string);
設置日誌路徑:xsh.Session.LogFilePath = string;
開始記錄日誌:xsh.Session.StartLog();
清屏函數:xsh.Screen.Clear();
等待輸入:xsh.Screen.WaitForString(string);
示例
本文以一個自動測試腳本為例,定時向/tmp/test文件寫入數據,然後回讀列印,截獲回讀列印的值進行分析
/* 測試函數 /
function test()
{
/ 發送echo 112233 > /tmp/testfile */
xsh.Screen.Send("echo 112233 > /tmp/testfile");
xsh.Screen.Send(String.fromCharCode(13));
}
/* 主函數 /
function Main()
{
/ 打開會話,根據實際的會話路徑修改 */
xsh.Session.Open("C: Computer6XshellSessionsubuntu.xsh");
xsh.Screen.Synchronous = true;
// xsh.Screen.WaitForString("start");
// xsh.Screen.Clear();
}
運行腳本的操作:
在編寫xshell腳本的過程中用到最多的就是自動輸入,自動捕獲,延時等語句
自動輸入
以自動輸入xyz為例
自動輸入的語句:xsh.Screen.Send("xyz");
當然,如果你輸入的是一條命令,還需要下面這一行輸入回車
輸入回車的語句:xsh.Screen.Send(String.fromCharCode(13));
自動捕獲
以linux系統為例,一般程序執行的列印數據位於倒數第二行,如下圖所示
/* 字元串處理 */
var ScreenRow, ReadLine, Items;
/* 讀取倒數第二行,長度為40個字元 */
ScreenRow = xsh.Screen.CurrentRow - 1;
ReadLine = xsh.Screen.Get(ScreenRow, 1, ScreenRow, 40);
延時
以等待1s為例
延時語句:xsh.Session.Sleep(1000);
其他
打開新會話:xsh.Session.Open(string);
對話框提醒:xsh.Dialog.MsgBox(string);
設置日誌路徑:xsh.Session.LogFilePath = string;
開始記錄日誌:xsh.Session.StartLog();
清屏函數:xsh.Screen.Clear();
等待輸入:xsh.Screen.WaitForString(string);
示例
本文以一個自動測試腳本為例,定時向/tmp/test文件寫入數據,然後回讀列印,截獲回讀列印的值進行分析
/* 測試函數 /
function test()
{
/ 發送echo 112233 > /tmp/testfile */
xsh.Screen.Send("echo 112233 > /tmp/testfile");
xsh.Screen.Send(String.fromCharCode(13));
}
/* 主函數 /
function Main()
{
/ 打開會話,根據實際的會話路徑修改 */
xsh.Session.Open("C: Computer6XshellSessionsubuntu.xsh");
xsh.Screen.Synchronous = true;
// xsh.Screen.WaitForString("start");
// xsh.Screen.Clear();
}
運行腳本的操作:
實際執行結果如下:
④ 如何用xshell編寫腳本
1、在編寫shell腳本的時候一般會先查詢伺服器可以使用哪種腳本,並且查看伺服器使用的默認腳本方式是哪一種。
⑤ Shell腳本編程實戰
做 Java 的肯定都接觸過 Linux 系統,那麼很多時候我們在開發的過程中都是把我們項目打成一個jar包,或者是war包的形式,然後通過 XFTP 上傳到我們伺服器的指定目錄,然後運行一端啟動腳本,讓我們的項目變得可以訪問 就像 ./sh service.sh start 然後啟動我們寫好的 sh 的shell腳本。接下來我們就來學習一下關於 Shell 腳本是如何寫出來的。
Shell 腳本是什麼?Shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等,也就是說,我們用戶每輸入一條命令,Shell 就會相對應的執行一條命令。當命令或程序語句不在命令行下執行,而是通過一個程序文件來執行時,該程序文件就被稱為Shell腳本。
在我們的 Shell 腳本中,會有各種各樣的內容,賦值,計算,循環等一系列的操作,接下來我們就來看看這個 Shell 腳本怎麼寫吧
1.查看自己當前系統默認的 Shell
echo $SHELL
輸出:/bin/bash
2.查看系統支持的Shell
cat /etc/shells
輸出:
/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
也就是說,我們的雲伺服器是支持我們在這里給他安排 Shell 腳本的
我們這時候先來安排一下 sh 的文件,創建一個文件夾,然後在其中創建一個 sh 的文件。
mkdir /usr/local/shelltest
touch test.sh
創建完成我們編輯一下內容
vim test.sh
然後我們出來運行一下我們的 Shell 的第一個腳本
bash test.sh
出來的結果是 Hello World Shell
一個及其簡單的腳本出現了,接下我們就分析一波我們寫了點啥?
#!/bin/bash
#! 是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell
我們在之前也使用了 echo $SHELL 來查看了自己系統默認的是哪一種 sh 解析器,之前看到的是/bin/bash,所以我們在寫 Shell 腳本的時候,我們在開頭默認的約定中,我們寫了這個是用 /bin/bash 來進行解釋的,
那麼我們如何像之前調用我們的當前目錄中的 Shell 腳本一樣去調用他呢?就像這個樣子的 ./sh service.sh start
1.授權,
我們先不授權試一下看看能通過 ./test.sh 進行調用么
bash: ./test.sh: Permission denied 會提示這個,也就是沒有授權定義,
授權命令:chmod +x test.sh
2.執行 ./test.sh
然後調用就能正常輸出了,就是說,在當前的目錄下執行這個腳本命令。
變數命名實際上很簡單,我們先來試一下
name=yikeji
這時候我們怎麼使用變數呢?實際上只要在前面加上一個符號就可以 $
echo $name
上面的兩種寫法都是可以的,外面的大括弧加和不加區別不大,可以省略,直接就 $name 就可以使用你定義的變數
使用括弧的意義一般在於區別某些變數,比如你寫了一串的內容,可能寫的是 echo $nameismyfriend ,如果連在一起,是不是有點尷尬,這時候就可以使用括弧區別一下, echo ${name}ismyfriend 不使用括弧的時候,他就去找nameismyfriend這個變數了,就無法出來我們要的效果。
unset name
這時候我們就把我們剛才定義的 name=yikeji 這個變數給去掉了,我們可以調用一下我們的變數看是什麼?
echo $name
這是不是就證明我們自己定義的變數已經刪除了
那麼我們需要一個關鍵字,大家肯定能想到是什麼關鍵字 readonly
我們先給name賦值,然後使用 readonly 設置只讀,然後再改變一下試試,
竟然是真的,如果不設置只讀,是不是會重新可以進行賦值,我們測試個年齡,
所以我們就可以肯定,readonly就是設置只讀的關鍵詞,記住了么?
那麼設置只讀的變數可以刪除么?畢竟總有杠精的面試官會提問這個棘手的問題,但是,阿粉試過的所有方式好像都是不行的,阿粉就直接重啟了自己的伺服器,這樣臨時的變數就不存在了!
說真的,Shell腳本的流程式控制制數一般才是yyds,為什麼這么說,因為你在寫大部分的腳本的時候,流程式控制制的地方永遠是最多的,判斷,選擇,等等一系列的函數,當時熟練使用的時候,就發現這東西確實很有意思。
我們先說最簡單的 if else 這也是我們最經常使用的判斷,在寫 Shell 腳本的時候,就不像我們的 Java 中直接寫
Xshell 中的語法就不是這個樣子的, Xshell 語法:
末尾的 fi 就是 if 倒過來拼寫,我們可以寫一個 if 的腳本試一下這個流程能否理解。
這里申明一下,
我們在上面這段腳本中寫就是內容就是,我們給腳本傳入一個值,然後比對這個值和2的大小關系,然後輸出我們指定的內容。
運行後就能看到
$1 表示我們給 Shell 腳本輸入的第一個參數, $0 就是你寫的shell腳本本身的名字,$2 是我們給 Shell 腳本傳的第二個參數
大家在部署某些項目的時候,是不是啟動命令就很簡潔,就是 sh service.sh start 類似這種的,那我們來看看一般這種是怎麼寫的,這就用到了另外一塊的內容,和 if 類似,在 Java 中也有,那就是 Case .
我們先來看看 Case 的語法,
case ... esac 實際上就和 Java 中的 Case 是非常相似的,case 語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令. esac 是一個結束的標志。
光說不練,假把式,我們來搞一下試試寫一個腳本來搞一下。就用我們剛才說的 sh servic.sh start 來進行測試。
我們來看看運行結果
那麼這段 Shell 腳本是什麼意思呢?其實很簡單,匹配我們傳入的第一個字元,和 start 還有 stop 進行比較,如果匹配上之後,輸出命令,最後退出即可。
是不是感覺沒有那麼復雜了呢?
說到流程式控制制,那麼肯定不能不說 for , 畢竟 for 循環在 Java 中那可是重頭戲。
我們先看他的格式
那麼我們有沒有說像是 Java 中那種 for 循環一樣的方式呢?比如說這個 for ((i=1; i<=j; i++))
實際上也是支持這種的,我們來寫一個試試。
執行一下看看
既然有 for 那是不是就有 while 呢?是的,沒錯,確實是有 while ,也是循環的意思,但是寫法有略微不一樣的地方
我們來舉個嘗試列印九九乘法表來看一下
是不是也挺簡單的?
其實 Shell 腳本的編寫一般都是在實際應用中提升,單純的寫測試腳本,也是可以讓自己對知識的掌握比較充分,而我們一般都是寫一些比較簡單的腳本,復雜的不是還有運維么?