<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
免互動就是實現一個功能時,不需要連續從鍵盤輸入資訊,通過指令碼或命令自動完成一些動作。
使用 I/O 重定向的方式將命令列表提供給互動式程式或命令,比如 ftp、cat或read命令。
HereDocument是標準輸入的一種替代品,可以幫助指令碼開發人員不必使用臨時檔案來構建輸入資訊,而是直接就地生產出一個檔案並用作命令的標準輸入。
命令 <<標記
……
……
標記#特殊字元“<<”在標記和命令之前,這樣做的目的是將命令塊的輸出重定向到程式和命令的stdin。
#標記的選擇要確保不會出現在其他地方,避免出現混淆;兩個標記之間的內容被當做是一個檔案並用作“命令”的標準輸入。
#另外Here Document也可以與非互動式程式和命令一起使用
四點注意事項:
[root@c7-1 ~]# cat <<EOF //直接把輸入的從命令列輸出 > hello world > EOF hello world [root@c7-1 ~]# cat > name <<EOF //輸入儲存到檔案 > liuchun > zhougang > EOF [root@c7-1 ~]# cat name liuchun zhougang [root@c7-1 ~]# cat >> name <<EOF //追加輸入儲存到檔案 > liufei > EOF [root@c7-1 ~]# cat name liuchun zhougang liufei
例:建立yum源
[root@c7-1 ~]# cat > test.repo <<EOF > [test] > name=test > baseurl=file:///mnt > enabled=1 > gpgcheck=0 > EOF 另外寫法1 cat <<EOF > local.repo 另外寫法2 tee test1.txt <<EOF
3.1 通過 read 命令接收輸入並列印,輸入值是兩個 EOF 標記之間的部分,也就是“10”,這將作為變數 a 的值
[root@c7-1 ~]# read a <<EOF > 10 > EOF [root@c7-1 ~]# echo $a 10
3.2 通過 passwd 給使用者設定密碼
[root@c7-1 ~]# passwd zhangsan <<EOF > 123456 > 123456 > EOF 更改使用者 zhangsan 的密碼 。 新的 密碼:無效的密碼: 密碼少於 8 個字元 重新輸入新的 密碼:passwd:所有的身份驗證令牌已經成功更新。
4.1 在寫入檔案時要先將變數替換成實際值,在結合 cat 命令完成寫入
例1:
[root@localhost ~]# aa=$(cat <<EOF //變數替換 > $a > EOF > ) echo $aa
例2:
#!/bin/bash doc_file="123.txt" i="123" cat > $doc_file << EOF Welcome to $i EOF this is $i cat 123.txt
4.2 整體賦值給一個變數,然後通過 echo 命令將變數值列印出來
#!/bin/bash ivar="Great! Beautyful!" myvar=$(cat <<EOF #將Here Document 整體賦值給變數 This is Line 1. That are Sun,Moon and Stars. $ivar #輸出時會進行變數替換 EOF ) echo $myvar
5.1 關閉變數替換的功能
[root@c7-1 ~]# aa=$(cat <<'EOF' //關閉變數替換 對標記加單引號,即可關閉變數替換 20 $a EOF ) echo $aa #!/bin/bash cat <<'EOF' //對標記加單引號,即可關閉變數替換 This is Line 1. $kkk EOF
5.2 去掉每行之前的 TAB 字元
在第一行的標記前面加‘-’,這個表示要抑制各行首 TAB 的作用。
[root@c7-1 ~]# vim dome3.sh //寫一個指令碼測試抑制tab鍵輸出 #!/bin/bash cat <<EOF hello world EOF cat <<-EOF //加 - 去除tab hello world EOF [root@c7-1 ~]# bash tab.sh hello world hello world
Bash 的預設註釋是“#”,該註釋方法只支援單行註釋,在 Shell 指令碼的工作中,“#”右側的任何字串,bash 都會將其忽略。Here Document 的引入解決了多行註釋的問題。
: 代表什麼都不做的空命令。中間標記區域的內容不會被執行,會被bash 忽略掉,因此可達到批次註釋的效果。
#!/bin/bash : <<-EOF //多行註釋 以 :開頭的Here Document標記內容不會被執行 the second comment. test line. EOF echo "dashiji"
建立在tcl語言基礎上的一個工具,常被用於進行自動化控制和測試,解決shell指令碼中互動相關的問題
expect是一個程式,所以他也是需要提前安裝才可以使用的
[root@c7-1 expect]# rpm -q expect [root@c7-1 expect]# rpm -q tcl [root@c7-1 expect]# yum install expect -y //安裝expect時會把tcl作為依賴包安裝
(1)指令碼直譯器
expect指令碼中首先引入檔案,表明使用的是哪一個shell #!/usr/bin/expect
(2)spawn
spawn後面通常跟一個Linux執行命令,表示開啟一個對談、啟動程序,並跟蹤後續互動資訊。
例如:
spawn passwd root
(3)expect
判斷上次輸出結果中是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回;
只能捕捉由spawn啟動的程序的輸出;
用於接收命令執行後的輸出,然後和期望的字串匹配
(4)send向程序傳送字串,用於模擬使用者的輸入;該命令不能自動回車換行,一般要加 r (回車) 或者 n
方式一: expect "密碼"{ send "abc123r" } //同一行send部分要有{} 方式二: expect "密碼" send "abc123r" //換行send部分不需要有{} 方式三: expect支援多個分支 expect //只要匹配了其中一個情況,執行相應的send語句後退出該expect語句 "密碼1"{ send "abc123r" } "密碼2"{ send "123456r" } "密碼3"{ send "123123r" }
(5)結束符
expect eof
表示互動結束,等待執行結束,退回到原使用者,與spawn對應。
比如切換到root使用者,expect指令碼預設的是等待10s,當執行完命令後,預設停留10s後,自動切回了原使用者
interact
執行完成後保持互動狀態,把控制權交給控制檯,會停留在目標終端而不會退回到原終端,這個時候就可以手工操作了,interact後的命令不起作用,比如interact後新增exit,並不會退出root使用者。而如果沒有interact則登入完成後會退出,而不是留在遠端終端上。
注意:expect eof 與 interact 只能二選一。
(6)set
expect 預設的超時時間是10秒,通過 set命令可以設定對談超時時間,若不限制超時時間則應設定為-1。
例:
set timeout 30
(7)exp_continue
附加於某個expect判斷項之後,可以使該項被匹配後,還能繼續匹配該expect-判斷語句內的其他項。exp_continue類似於控制語句中的continue 語句。表示允許expect繼續向下執行指令。
例如:下例將判斷互動輸出中是否存在yes/no 或*password。如果匹配 yes/no 則輸出 yes並再次執行判斷;
如果匹配*password則輸出abc123並結束該段expect語句。
expect{ "(yes/no)" { send "yesr";exp_continue;} "*password" { set timeout 300;send "abc123r";} } #注意:使用exp continue時,如果跟蹤像passwd這樣的輸入密碼後就結束程序的命令,expect{}外不要再加上expect eof #因為spawn程序結束後會預設向expect傳送eof,會導致後面的expect eof執行報錯 #注:表示允許使用者進行互動操作,一直保持回話連線
(8)send user
send user 表示回顯命令,相當於echo
(9)接收引數
expect指令碼可以接受從bash命令列傳遞的引數,使用[lindex $argvn]獲得。
其中n從o開始,分別表示第一個,第二個,第三個..引數。例:
set hostname [ lindex $argy 0 ]
相當於hostname=$1
set password [ lindex $argy 1 ]
相當於password=$2
4.1 ssh無互動登入到遠端伺服器
[root@c7-1 expect]# vim dome1.sh #!/usr/bin/expect //這裡需要用expect自己的直譯器,注意不要寫成bash否則無法識別 spawn ssh root@192.168.3.100 //開啟一個程式,這個程式是ssh遠端登入 expect { //捕獲內容,當出現password的時候,就會向程式傳送密碼,預設是不換行的,所以需要r回車換行,多個條件需要花括號括起來,注意格式問題! "password" { send "123r"; } } interact
4.2 如果想要在對方伺服器上進行一下操作後再退出可執行以下指令碼
[root@c7-1 ~]# vim expect.sh #!/usr/bin/expect spawn ssh root@192.168.3.100 expect { "password:" { send "123456r"; } } expect "#" //當捕獲到#的時候 send "lsr" //執行ls命令 send "ifconfig ens33r" //執行ifconfig ens33命令 send "exitr" //執行完exit退出登陸 expect eof //不需要進行互動了,意味著結束expect程式,如果不寫的話不會執行操作直接退出;如果不寫,寫interact也無法在對方機器上執行命令,eof可以替換
4.3 定義和參照變數
用set關鍵字定義變數,變數名和變數的值中間用空格分開,其他用法與shell指令碼一致
#!/usr/bin/expect set user root set ip 192.168.3.100 set pass 123456 #參照位置變數 #!/usr/bin/expect set user root set ip [lindex $argv 0] //設定第一個位置變數為ip set pass [lindex $argv 1] //設定第二個位置變數為登陸密碼 spawn ssh $user@$ip expect { "password:" { send "$passr"; } } expect "#" send "lsr" send "ifconfig ens33r" send "exitr" expect eof [root@c7-1 ~]# ./expect sh 192.168.3.100 123456 //執行時需要加位置變數 #####還可以定義其他引數,例如超時時間,紀錄檔等 #超時時間 set timeout 20 //登陸超時多少秒退出 #開啟紀錄檔檔案 log_file test.log //紀錄檔記錄操作 #顯示資訊 log_user 1 //1為螢幕輸出資訊,0為不輸出
4.4 在shell指令碼中呼叫expect
#!/bin/bash username=$1 useradd $username /usr/bin/expect <<-EOF spawn passwd $username expect { "新的 密碼" //注意:獲取的內容和傳送的內容不能在同一行否則執行不成功 {send "123456r";exp_continue} "重新輸入新的 密碼" {send "123456r";} } EOF 驗證結果: [root@c7-1 ~]# ./user.sh wangwu spawn passwd wangwu 更改使用者 wangwu 的密碼 。 新的 密碼: 無效的密碼: 密碼少於 8 個字元 重新輸入新的 密碼: passwd:所有的身份驗證令牌已經成功更新。
藉助 expect 處理互動的命令,可以將互動過程如 ssh 登入,ftp 登入等寫在一個指令碼上,使之自動化完成。
適用於需要對多臺伺服器執行相同操作的環境中,可以大大提高系統管理人員的工作效率,使用它,你甚至可以僅僅執行一個指令碼來完成分散式應用系統的搭建與維護。
到此這篇關於Shell之免互動的實現的文章就介紹到這了,更多相關Shell 免互動內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45