命令 << 標記linux
傳入的內容shell
標記bash
注意服務器
在寫入文件時,會先將變量替換爲實際值,在結合cat 命令完成寫入ssh
#!/bin/bash file="EOF.txt" i="school" cat > $file <<EOF this is my $i EOF cat EOF.txt
#!/bin/bash var="great! i am going to school!" myvar=$(cat <<EOF this is line 1. today is monday. $var EOF ) #) 要另起一行寫,不能夠寫在EOF 後面 #變量要加上雙引號「」 ,不然內容將會輸出在1行中 echo "$myvar"
#!/bin/bash var="great! i am going to school!" #在第一個標記兩邊加上單引號'' 便可關閉變量的替換功能 myvar=$(cat <<'EOF' this is line 1. today is monday. $var EOF ) #")" 要另起一行寫,不能夠寫在EOF 後面 echo "$myvar"
#!/bin/bash var="great! i am going to school!" #在第一個標記前面加上"-" ,既能夠抑制各行行首的TAB #注意,只是抑制TAB,而不是空格 myvar=$(cat <<-EOF this is line 1. today is monday. $var EOF ) #) 要另起一行寫,不能夠寫在EOF 後面 echo "$myvar" ~
":"表明什麼都不作的空命令。中間標記區域的內容不會被執行,會被bash忽略掉,所以可達到批量註釋的效果ide
#!/bin/bash # ":" 開頭的Here Document 標記內容不會被執行 : <<EOF this is line 1. today is monday. EOF echo "abcd"
創建在tcl語言基礎上的一個工具,常被用於進行自動化控制和測試,解決shell腳本中交互相關的問題。工具
因此,須要先安裝軟件包 expect 和 tcl測試
yum -y install expect
this
expect 腳本中首先引入文件,代表使用的是哪個shellspa
#!/usr/bin/expect
spawn 後面一般跟一個linux 執行命令,表示會開啓一個會話,啓動進程,並跟蹤後續交互信息
spawn passwd root
向進程發送字符串,用於模擬用戶的輸入;改命令不能自動回車換行,通常要加 \r (回車)或者 \n換行
expect "密碼" {send "1234567\n"} #同一行send 部分要有 { }
expect "密碼" send "1234567\n" #換行send 部分不須要有 { }
#expect 支持多分枝。只要匹配了其中一個狀況,執行相應的send 語句後,退出相應的expect語句 expect { "密碼" {send "1234567\n} "password" {send "1234567"} }
expect eof
表示交互結束,等待執行結束,退回到原用戶,與spawn 對應
如:切換到root 用戶,expect 腳本默認是等待10s,當執行完命令後,停留10s,而後自動切換回原用戶
interact
執行完成後保持交互狀態,吧控制權交給控制檯,會停留在目標終端而不會退回到原終端。這個時候就能夠手工操做。
interact 後的命令不起做用。好比interact 後面添加exit ,並不會退出root用戶。
而若是沒有interact ,則登陸完成後會退出,而不是留在遠程終端上
使用interact會保持在終端而不會退回到原終端,好比切換到root用戶,會一直在root用戶狀態下; 好比ssh到另外一服務器,會一直在目標服務器終端,而不會切回的原服務器。
# expect eof 和 interact 只能二選一
expect 默認超時時間是10 秒,經過set 命令能夠設置會話超時時間。若不限制超時時間,則設置爲 -1
set timeout 10
exp_continue 附加於某個 expect 判斷項以後,可使該項被匹配後,還能繼續匹配該 expect 判斷語句內的其餘項。exp_continue 相似於控制語句中的 continue 語句。表示容許 expect 繼續向下執行指令
使用exp_continue 時,若是跟蹤像passwd 這樣的輸入密碼後就結束的進程的命令,expect{} 外不要再加上expect eof 。由於spawn 進程結束後會默認向expect發送eof ,會致使後面的expect eof報錯
expect { "(yes/no)" {send "yes\n";exp_continue;} "*password" {set timeout 300;send "1234567";} } #判斷交互輸出中是否存在yes/no 或者*password 。若是匹配 yes/no 則輸出yes,並再次執行判斷;若是匹配*password 則輸出1234567,並結束該段expect6語句
send_user 表示回顯命令,至關於echo
expect 腳本口語i接受從bash 命令行傳遞的參數,使用 [lindex $argv n]
得到。n 從0開始,分別表示第一個,第二個...... 參數
set hostname [lindex $argv 0] set password [lindex $argv 1]
#!/usr/bin/expect #設置超時時間爲5s set timeout 5 #設置第一個位置參數 set username [lindex $argv 0] #設置第二個位置參數 set password [lindex $argv 1] #開啓跟蹤命令 spawn su - $username #免交互執行,捕捉信息並匹配 expect "密碼:" send "${password}\n" #結束符 #若是設置成expect eof 則會切換用戶後,過5s,而後自動退回到原用戶 interact
#!/usr/bin/expect set timeout 5 set hostname [lindex $argv 0] set password [lindex $argv 1] spawn ssh $hostname #設置多分支匹配 #ssh遠程,首次登陸須要保存登陸主機信息。 expect { "NO route to host" exit "Connection refused" exit "(yes/no)" {send "yes\n" ;exp_continue} "password:" {send "$password\n"} } interact
將expect 過程融入到 shell 當中,方便執行和處理
例:建立用戶並設置密碼
#!/bin/bash #設置位置參數傳入 #設置第一個位置參數 username=$1 #設置第二個位置參數 password=$2 #注意,/usr/bin/expect解釋器不支持useradd useradd $username #使用Here Document 將expect 的輸入直接交給 /usr/bin/expect 執行 /usr/bin/expect <<EOF #開啓命令跟蹤 spawn passwd $username #免交互執行,捕捉信息並匹配 expect "新的 密碼" send "${password}\n" expect "從新輸入新的 密碼" send "${password}\n" #結束免交互 expect eof EOF #結尾標記