Shell Here Document 免交互命令和Expect
Shell Here Document 免交互命令和Expect
- 一、Here Document 免交互命令
- 二、Expect
- 1.基本命令
- 2.示例
- 3.嵌入執行模式
- 4.實現ssh自動登錄
- 5.免交互創建磁盤
一、Here Document 免交互命令
使用I/O重定向的方式將命令列表提供給交互式程序或命令,比如ftp、cat或read命令。
是標準輸入的一種替代品可以幫助腳本開發人員不必使用臨時文件來構建輸入信息,而是直接就地生成出一個“文件”并用作“命令”的標準輸入。Here Document 也可以與非交互式程序和命令一起使用。
注意事項:
標記可以使用任意合法字符 (通常使用EOF)
結尾的標記一定要頂格寫,前面不能有任何字符
結尾的標記后面也不能有任何字符(包括空格)
開頭標記前后的空格會被省略掉
二、Expect
建立在tcl語言基礎上的一個工具,常被用于進行自動化控制和測試,解決shell腳本中交互相關的問題。
rpm -q expect rpm -q tcl yum -y install expect1.基本命令
1.腳本解釋器
expect腳本中首先引入文件,表明使用的是哪一個shell
2.spawn
spawn后面通常跟一個Linux執行命令,表示開啟一個會話、啟動進程,并追蹤后續交互信息。
3.expect
判斷上次輸入結果中是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回:只能捕捉由spawn啟動的進程的輸出;
用于接收命令執行后的輸出,然后和期望的字符串匹配
4.send
向進程發送字符串,用于模擬用戶的輸入;該命令不能自動回車換行。一般要加\r(回車)或者\n
5.結束符
expect eof
表示交互結束,等待執行結束,退回到原用戶,與spawn對應
比如切換到root用戶,expect腳本默認的是等待10s,當執行完命令后,默認停留10s后,自動切回了原用戶
interact
執行完成后保持交互狀態,把控制權交給控制臺,會停留在目標終端,這個時候就可以手工操作了,interact后的命令不起作用,比如interact會保持在終端而不會退回到原終端,比如切換到root用戶,會一直在root用戶狀態下;比如ssh到另一服務器,會一直在目標服務器終端,而不會切回的原服務器。
6.set
expect 默認的超時時間是10秒,通過set命令可以設置會話超時時間,若不限制超時時間則應設置為-1.
7.exp_continue
exp_continue 附加于某個expect判斷項之后,可以使該項匹配后,還能繼續匹配該expect判斷語句內的其他項。exp_continue類似于控制語句中continue語句。表示允許expect繼續向下執行指令
下例將判斷交互輸出中是否存在yes/no 或*password。 如果匹配yes/no 則輸出yes 并再次執行判斷;如果匹配 *assword則輸出abc123 并結束該段expect 語句。
expect "(yes/no)" {send "yes\r"; exp_ continue; } "*password" {set timeout 300; send "abc123\r";}注意:使用exp_ continue時,如果跟蹤像passwd 這樣的輸入密碼后就結束進程的命令,expect{}外不要 再加上expect eof
因為spawn進程結束后會默認向expect發送eof,,會導致后面的expect eof 執行報錯
8.send_ user
send_ user 表示回顯命令,相當于echo
9.接收參數
expect腳本可以接受從bash命令行傳遞的參數,使用[lindex $argv n] 獲得。其中n從0開始,分別表示第一一個, 第二個,第三個…參數。
2.示例
expect直接執行,需要使用expect 命令去執行腳本 su切換用戶 #! /usr/bin/expect #設置超時時間 set timeout 5 #參數傳入 set username [lindex $argv 0] set password [lindex $argv 1] #開始追蹤命令 spawn su $username #免交互執行,捕捉信息并匹配 expect "密碼" send "password\r" expect "*]#" send user "ok" . #把控制權交給控制臺 interact #expect eof
3.嵌入執行模式
創建用戶并設置密碼
#! /bin/bash user=$1 password=$2 #非交互命令放在expect外面 useradd $user #開始免交換執行 /usr/bin/expect <<-EOF #expect開始標志 spawn passwd $user #開啟-一個進程跟蹤passwd命令,expect只能捕捉該進程信息 expect "新的*" send "$ {password}\r" . expect "重新*" send "$ {password} \r" expect eof EOF4.實現ssh自動登錄
#! /usr/bin/expect set timeout 5 set hostname [lindex $argv 0 ] set password [lindex $argv 1]spawn ssh $hostname expect {"Connection refused" exit #連接失敗情況,比如對方ssh服務關閉"Name or service not known" exit #找不到服務器,比如輸入的IP地址不正確" (yes/no)" {send "yes\r" ;exp_continue}"password:" {send "$password\r"} interact exit #interact后的命令不起作用嵌入式:
#!/bin/bash hostname=$1 password=$2/usr/bin/expect <<EOF spawn ssh root@${hostname}expect {"Connection refused" exit"No route to host" exit"(yes/no)" {send "yes\r";exp_continue}"password" {send "$password\r"} } expect "*]#" send "ifconfig\r" expect eof EOF5.免交互創建磁盤
#!/bin/bash disk=$1 /usr/bin/expect <<EOF spawn fdisk $disk expect "命令" {send "n\r"} expect "Select" {send "p\r"} expect "分區" {send "\r"} expect "起始" {send "\r"} expect "Last" {send "\r"} expect "命令" {send "w\r"} expect eof EOF
總結
以上是生活随笔為你收集整理的Shell Here Document 免交互命令和Expect的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存超频:提速与降速
- 下一篇: i7 6700k主板内存价格大降!游戏玩