柚子快報(bào)邀請(qǐng)碼778899分享:shell腳本【免交互】
柚子快報(bào)邀請(qǐng)碼778899分享:shell腳本【免交互】
目錄
1. Here Document 免交互
1.1? Here Document概述
1.2 實(shí)驗(yàn)操練?
1.3 tee命令?
?1.4 變量替換
??2. expect 免交互
2.2 實(shí)驗(yàn)操練
1. Here Document 免交互
1.1? Here Document概述
? *使用I/O重定向的方式將命令列表提供給交互式程序或命令,比如 ftp、cat 或 read 命令。 ? *標(biāo)準(zhǔn)輸入的一種替代品, Here Document 也可以與非交互式程序和命令一起使用。
語法格式:
命令 <<標(biāo)記 (此處標(biāo)記的前后面可以有空格)
...
內(nèi)容 #標(biāo)記之間是傳入內(nèi)容
...
標(biāo)記 #結(jié)尾的標(biāo)記字符要和開頭的標(biāo)記字符,保持相同的大小寫,并且結(jié)尾標(biāo)記必須要頂格寫
注意事項(xiàng):
?
1.2 實(shí)驗(yàn)操練?
一、免交互修改用戶密碼
[root@localhost ~]# vim /etc/passwd
[root@localhost ~]# passwd liuyuchun < > abc1234 > abc1234 > EOF 更改用戶 liuyuchun 的密碼 。 新的 密碼:無效的密碼: 密碼未通過字典檢查 - 過于簡單化/系統(tǒng)化 重新輸入新的 密碼:passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。 ?二、免交互修改配置文件 [root@localhost ~]# cat < > [local] > name=local > baseurl=file:///mnt > enabled=1 > gpgcheck=0 > EOF [root@localhost ~]# cat local.repo [local] name=local baseurl=file:///mnt enabled=1 gpgcheck=0 1.3 tee命令? ?tee命令解釋 [root@localhost day20]# cat < > 123 > 456 > abc > EOF 123 456 abc [root@localhost day20]# cat < > 淳人 > 好老師 > EOF 淳人 好老師 [root@localhost day20]# [root@localhost day20]# cat abc.txt 123 456 abc 淳人 好老師 [root@localhost day20]# [root@localhost day20]# cat < > 1111 > 2222a > EOF 1111 2222a 1111 2222a [root@localhost day20]# cat < > 1111 > 2222A > EOF 1111 2222A 1111 2222A 1111 2222A [root@localhost day20]# ls | tee file abc.txt day20 file file1 file2 test.txt [root@localhost day20]# cat file abc.txt day20 file file1 file2 test.txt ?1.4 變量替換 初始狀態(tài) 默認(rèn)情況下EOF中間的內(nèi)容支持變量的替換;如果要關(guān)閉變量的替換,開頭標(biāo)記要用 '' 括起來,即 ?<<'EOF' 如果要抑制行首的制表符空白,開頭標(biāo)記前要加 - ,即 <<-EOF 如果要注釋多行內(nèi)容,可用 ?: < ?2. expect 免交互 建立在tcl語言基礎(chǔ)上的一個(gè)工具,常被用于進(jìn)行自動(dòng)化控制和測試,解決shell腳本中交互相關(guān)的問題?? rpm -q expect rpm -q tcl yum install -y expect 基本命令:(1)腳本解釋器 expect 腳本中首先引入文件,表明使用的是哪一個(gè) shell。 #!/usr/bin/expect (2)spawn spawn 后面通常跟一個(gè)Linux執(zhí)行命令,表示開啟一個(gè)會(huì)話、啟動(dòng)進(jìn)程,并跟蹤后續(xù)交互信息。 例:spawn passwd root (3)expect判斷上次輸出結(jié)果中是否包含指定的字符串,如果有則立即返回,否則就等待超時(shí)時(shí)間后返回; 只能捕捉由spawn啟動(dòng)的進(jìn)程的輸出; 用于接收命令執(zhí)行后的輸出,然后和期望的字符串匹配 (4)send 向進(jìn)程發(fā)送字符串,用于模擬用戶的輸入;該命令不能自動(dòng)回車換行,一般要加\r(回車)或者\(yùn)n 例: 方式一: expect "密碼" {send "abc123\r"}?? ??? ?#同一行send部分要有{} 方式二: expect "密碼"?? ? send "abc123\r"?? ??? ??? ??? ??? ??? ??? ?#換行send部分不需要有{} 方式三: expect支持多個(gè)分支 expect?? ??? ??? ??? ??? ?#只要匹配了其中一個(gè)情況,執(zhí)行相應(yīng)的send語句后退出該expect語句 { "密碼1" {send "abc123\r"} "密碼2" {send "123456\r"} "密碼3" {send "123123\r"} } ? (5)結(jié)束符expect eof 表示交互結(jié)束,等待執(zhí)行結(jié)束,退回到原用戶,與spawn對(duì)應(yīng)。 比如切換到root用戶,expect腳本默認(rèn)的是等待10s,當(dāng)執(zhí)行完命令后,默認(rèn)停留10s后,自動(dòng)切回了原用戶 interact 執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺(tái),會(huì)停留在目標(biāo)終端而不會(huì)退回到原終端,這個(gè)時(shí)候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不會(huì)退出root用戶。而如果沒有interact則登錄完成后會(huì)退出,而不是留在遠(yuǎn)程終端上。 使用interact會(huì)保持在終端而不會(huì)退回到原終端,比如切換到root用戶,會(huì)一直在root用戶狀態(tài)下;比如ssh到另一服務(wù)器,會(huì)一直在目標(biāo)服務(wù)器終端,而不會(huì)切回的原服務(wù)器。 注意:expect eof 與 interact 只能二選一。 (6)set expect 默認(rèn)的超時(shí)時(shí)間是 10 秒,通過 set 命令可以設(shè)置會(huì)話超時(shí)時(shí)間, 若不限制超時(shí)時(shí)間則應(yīng)設(shè)置為-1。 例:set timeout 30 (7)exp_continue exp_continue 附加于某個(gè) expect 判斷項(xiàng)之后,可以使該項(xiàng)被匹配后,還能繼續(xù)匹配該 expect 判斷語句內(nèi)的其他項(xiàng)。exp_continue 類似于控制語句中的 continue 語句。表示允許 expect 繼續(xù)向下執(zhí)行指令。 例如:下例將判斷交互輸出中是否存在 yes/no 或 *password。如果匹配 yes/no 則輸出 yes 并再次執(zhí)行判斷;如果匹配 *password 則輸出 abc123 并結(jié)束該段 expect 語句。 expect { ? ? "(yes/no)" {send "yes\r"; exp_continue;} ? ? "*password" {set timeout 300; send "abc123\r";} } 注意:使用exp_continue時(shí),如果跟蹤像 passwd 這樣的輸入密碼后就結(jié)束進(jìn)程的命令,expect{}外不要再加上expect eof 因?yàn)閟pawn進(jìn)程結(jié)束后會(huì)默認(rèn)向expect發(fā)送eof,會(huì)導(dǎo)致后面的 expect eof 執(zhí)行報(bào)錯(cuò) (8)send_user send_user 表示回顯命令,相當(dāng)于 echo (9)接收參數(shù)expect 腳本可以接受從bash命令行傳遞的參數(shù),使用[lindex $argv n]獲得。其中n從0開始,分別表示第一個(gè),第二個(gè),第三個(gè)....參數(shù)。 set hostname [lindex $argv 0] ? ?? ?相當(dāng)于 hostname=$1 set password [lindex $argv 1]?? ??? ?相當(dāng)于 password=$2 2.2 實(shí)驗(yàn)操練 一、切換su用戶 #!/usr/bin/expect set timeout 20 #設(shè)置退出時(shí)間 spawn su root expect "密碼:" {send "abc1234\r"} expect "*]#" {send_user "root用戶切換成功!"} expect eof#退出免交互進(jìn)程,返回交互前狀態(tài),也就是原先未切換用戶的狀態(tài) ?二、ssh遠(yuǎn)程登錄 #!/usr/bin/expect set dest_host {lindex $argv 0} set password {lindex $argv 1} spawn ssh $dest_host expect { "Connection refused" {send_user "目標(biāo)主機(jī)訪問被拒絕\n"} "No route to host" {send_user "目標(biāo)主機(jī)沒有開機(jī)\n"} "(yes/no)" {send "yes\r"; exp_continue;} "*password:" {send "$password\r"} } #interact expect eof ?三、創(chuàng)建用戶并設(shè)置密碼的免交互操作 ? [root@localhost /opt]# bash demo3.sh xiao 請(qǐng)輸入xiao的密碼:123 useradd:用戶“xiao”已存在 spawn passwd xiao 更改用戶 xiao 的密碼 。 新的 密碼: 無效的密碼: 密碼少于 8 個(gè)字符 重新輸入新的 密碼: passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。 [root@localhost /opt]# vim demo3.sh #!/bin/bash外面環(huán)境仍然是shell腳本的shell環(huán)境 username=$1 read -p "請(qǐng)輸入$username的密碼:" password useradd $username #在bash環(huán)境中嵌入expect,expect嵌入模式不建議作ssh,su這種會(huì)保持狀態(tài)的交互操作 /usr/bin/expect << EOF #將EOF對(duì)中間的命令操作重定向輸入到/usr/bin/expect環(huán)境中 spawn passwd $username #spawn用來做定向跟蹤進(jìn)程 expect "新的*" #expect用來匹配指定字符 send "${password}\r" #send返回匹配后輸入的結(jié)果 expect "重新輸入*" send "${password}\r" expect eof #結(jié)束當(dāng)前免交互進(jìn)程 EOF ? 柚子快報(bào)邀請(qǐng)碼778899分享:shell腳本【免交互】 參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。