編碼的世界 / 優質文選 / 女人

ubuntu編寫.sh腳本文件


2022年5月11日
-   

編寫.sh腳本文件

一、bash方式運行


1.第一行是 #! /bin/bash
2.變量使用 變量定義格式為:變量名=值     a=1     b=2 引用變量時需要加上$符號 數學計算要使用[]括起來並且外面加$ sum=$[$a+$b] 用戶交互 read從鍵盤得到變量值  read-p與echo相似,都是打印輸出 read -p "Please input a number x,y" read x read y
$1,$2代表用戶輸入位置參數,如 sum=$[$1+$2] echo "$sum"
3.判斷語句格式 if 判斷語句一 ; then command elif 判斷語句二; then command else command fi

二、expect方式運行(參考博客1,參考博客2)


Expect是一個免費的編程工具語言,用來實現自動和交互式任務進行通信,而無需人的乾預。Expect的作者Don Libes在1990年開始編寫Expect時對Expect做有如下定義:Expect是一個用來實現自動交互功能的軟件套件(Expect [is a] software suite for automating interactive tools)。使用它系統管理員的可以創建腳本用來實現對命令或程序提供輸入,而這些命令和程序是期望從終端(terminal)得到輸入,一般來說這些輸入都需要手工輸入進行的。借助expect,我們可以將交互過程寫在一個腳本上,使之自動化完成。形象的說,ssh登錄,ftp登錄等都符合交互的定義。
如果裝有tcl,可以sudo apt install expect 安裝,whereis expect 查看路徑 ,終端輸入expect開始啟動。簡單的命令如下:
  set timeout           #設置超時時間,默認超時時間10s.
  spawn shell command   # spawn後面接的是我們要執行的shell命令
  expect "hi"        #匹配輸出內容“hi”
  {send “hello
”}                    # 匹配到內容''hi"後輸出“hello”,“
”是代表是返回字符。
  interact             #執行完成後保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登錄完成後會退出,而不是留在遠程終端上。如果你只是登錄過去執行一段命令就退出,可改為[expect eof]。
舉幾個例子
#!/usr/bin/expect -d   set timeout 30    spawn ssh -l username 192.168.1.1    expect "password:"    send "ispass/r"    interact
1. [#!/usr/bin/expect]    這一行告訴操作系統腳本裏的代碼使用那一個shell來執行。這裏的expect其實和linux下的bash是一類東西,-d啟動調試模式,可以不加。    注意:這一行需要在腳本的第一行。    2. [set timeout 30]    基本上認識英文的都知道這是設置超時時間的,現在你只要記住他的計時單位是:秒    3. [spawn ssh -l username 192.168.1.1]   spawn是進入expect環境後才可以執行的expect內部命令,如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。所以不要用 “which spawn“之類的命令去找spawn命令。好比windows裏的dir就是一個內部命令,這個命令由shell自帶,你無法找到一個dir.com 或 dir.exe 的可執行文件。   它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。    4. [expect "password:"]    這裏的expect也是expect的一個內部命令,有點暈吧,expect的shell命令和內部命令是一樣的,但不是一個功能,習慣就好了。這個命令的意思是判斷上次輸出結果裏是否包含“password:”的字符串,如果有則立即返回,否則就等待一段時間後返回,這裏等待時長就是前面設置的30秒   5. [send "ispass/r"]    這裏就是執行交互動作,與手工輸入密碼的動作等效。    溫馨提示: 命令字符串結尾別忘記加上“/r”,如果出現異常等待的狀態可以核查一下。    6. [interact]    執行完成後保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登錄完成後會退出,而不是留在遠程終端上。如果你只是登錄過去執行
#!/usr/bin/expect
spawn ssh 192.168.123.218 #ssh 遠程登陸
expect {
"*yes/no" {send "yes
";exp_continue} #匹配輸出內容,返回內容,exp_continue表示繼續執行下一步
"*password" {send "123456
"}
}
interact #執行完成後保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登錄完成後會退出,而不是留在遠程終端上。如果你只是登錄過去執行一段命令就退出,可改為[expect eof]

#!/usr/bin/expect
set ip [lindex $argv 0] #這條命令是將變量ip的值設置為傳入進來的第一個參數。[lindex $argv 0]表示的就是第一個參數的值
set port [lindex $argv 1] #這條命令是將變量port的值設置為傳入進來的第二個參數。[lindex $argv 1]表示的就是第二個參數的值
set passwd "123456"
spawn ssh $ip -p$port #使用變量,這裏使用的方法跟shell腳本一樣
expect {
"yes/no" {send "yes
";exp_continue}
"password:" {send "$passwd
"}
}
interact

4.一些命令 date 打印日期 sleep 3   休眠3秒 ifconfig  查看ip echo      輸出信息 gnome-terminal 打開另一終端 gnome-terminal tab 同一窗口打開另一終端 gnome-terminal window window  打開兩個新窗口終端 gnome-terminal title="new title" 或 gnome-terminal -t "new title"  設置標題 gnome-terminal -e ls   -e或者-s是啟動後自動執行命令,但是執行完終端會自動退出,一種辦法是 gnome-terminal -x bash -c "ls; exec bash"或 gnome-terminal -e 'bash -c "ls; exec bash"'但是-e和-x參數即將廢棄,需要使用代替,即常用的做法是  gnome-terminal bash -c "ls; exec bash" sudo pkill Xorg 注銷 sudo shutdown -h now 關機
set  指令能設置所使用shell的執行方式,可依照不同的需求來做設置
5.執行腳本 1.sh test.sh 2.chmod +x test.sh (可執行權限)  ./test.sh
基礎知識參考https://www.cnblogs.com/tnxk/archive/2012/08/09/2630195.html
 

熱門文章