做外貿(mào)翻譯用哪個(gè)網(wǎng)站好百度app安裝免費(fèi)下載
交互:我們發(fā)出指令控制程序的運(yùn)行,程序在接收到指令之后按照指令的效果做出對(duì)應(yīng)的反應(yīng)。
免交互:間接的通過第三方的方式把指令傳送給程序,不用直接的下達(dá)指令。
1、here document免交互
ere document免交互:是命令行格式,也可以寫在腳本當(dāng)中,通過I/O重定向的方式將命令的列表傳送給交互式程序或者命令
是標(biāo)準(zhǔn)輸入的一種替代品,代替了人工的輸入方式
語法格式:
命令(linux的系統(tǒng)命令)<<標(biāo)記
內(nèi)容1
內(nèi)容2
內(nèi)容3
標(biāo)記
#wc 統(tǒng)計(jì)字符串
[root@localhost /]# wc -l << xy102
> 123
> 456
> 789
> xy102
3
注意事項(xiàng):
1、標(biāo)記可以是任意的合法字符(一般不用特殊字符,不以數(shù)字開頭,通常以EOF作為默認(rèn)的標(biāo)記位)
2、結(jié)尾的標(biāo)記位一定要頂格寫,且前面不能有任何字符,空格也不行。
3、結(jié)尾的標(biāo)記后面也不能有任何字符,包括空格
4、開頭的標(biāo)記前后的空格都會(huì)被省略掉
#使用免交互修改用戶密碼
[root@localhost /]# passwd dn <<EOF
> 123
> 123
> EOF
#使用免交互賦值
[root@localhost /]# read i << EOF
123
EOF
[root@localhost /]# echo $i
123
2、tee命令免交互
[root@localhost opt]# tee jh1.txt <<EOF
> 1
> 2
> 3
> EOF
1
2
3
3、引入變量
創(chuàng)建mjh1.sh腳本寫入以下內(nèi)容
[root@localhost opt]# cat mjh1.sh
#!/bin/bash
file="test9.sh"
i=school
cat > $file <<EOF
I am going to $i
EOF
運(yùn)行腳本生成test9.sh腳本文件
查看test9.sh腳本內(nèi)容?
?
4、?整體變量賦值
將var字符串內(nèi)容整體賦值給myvar
#!/bin/bash
var="good I am going to school"
#整體賦值方式
myvar=$(
cat <<EOF
zhangsan say
$var
EOF
)
echo $myvar輸出結(jié)果
[root@localhost opt]# sh mjh1.sh
zhangsan say good I am going to school將EOF加單引號(hào),關(guān)閉整體變量賦值
#!/bin/bash
var="good I am going to school"
myvar=$(
cat <<'EOF'
zhangsan say
$var
EOF
)
echo $myvar
輸出結(jié)果
[root@localhost opt]# sh mjh1.sh
zhangsan say $var
5、Expect實(shí)現(xiàn)免交互
用tcl語言寫的一個(gè)工具,主要用自動(dòng)化控制和測(cè)試。解決shell腳本交互的問題
需要先下載
[root@localhost opt]# yum -y install expect
實(shí)例
#!/usr/bin/expect
#聲明解釋器,不再是默認(rèn)的bash,需要聲明,使用whereis expect 查找目錄位置
set timeout 5
#set 設(shè)置,timeout 超時(shí)時(shí)間,expect有一個(gè)默認(rèn)的超時(shí)時(shí)間10秒,設(shè)置超時(shí)時(shí)間5秒
#set也可以作為設(shè)置變量
spawn passwd dn
#spawn用來聲明需要執(zhí)行的命令,開啟會(huì)話過程,并且跟蹤后續(xù)的交互信息
expect "新的 密碼:"
#expect來捕獲需要執(zhí)行的命令行
#捕獲不需要完整的可以使用*代表所有
send "zlm12388\r"
#send 表示輸入指令代碼,\r表示回車
expect "重新輸入新的 密碼:"
send "zlm12388\r"expect eof
#交互指令結(jié)束之后,會(huì)退回原用戶,切換回之前的用戶
#interact
#留在當(dāng)前用戶,不會(huì)改變#最后一定要有結(jié)束語,以上兩個(gè)只能選一個(gè)
?執(zhí)行腳本要先賦權(quán),使用./的方式執(zhí)行 ?
實(shí)例:普通用戶進(jìn)行切換?
#!/usr/bin/expect
set timeout 5
set username [lindex $argv 0]
set password [lindex $argv 1]
#位置變量#開始追蹤
spawn su - $username
#免交互開始執(zhí)行
expect "密碼"
send "$password\r"
#繼續(xù)捕獲
expect "~]$"
send_user "ok"
#send_user =echo 打印指定內(nèi)容
#結(jié)束語
interact
?實(shí)現(xiàn)效果
結(jié)束語使用?expect eof效果
6、?嵌入執(zhí)行模式
嵌入執(zhí)行模式,在shell當(dāng)中加入expect,涉及到環(huán)境切換的場(chǎng)景不建議使用嵌套
例如ssh su 不適用使用嵌入模式
#!/bin/bash
user=$1
password=$2
#非交互命令,使用的是shell
useradd $user
#嵌入免交互
/usr/bin/expect <<-EOF
spawn passwd $user
expect "新的*"
send "$password\r"
expect "重新*"
send "$password\r"
expect eof
EOF
?實(shí)現(xiàn)效果
7、使用ssh連接其他主機(jī) ?
基礎(chǔ)版
#!/usr/bin/expect
set ip 192.168.10.30
set user root
set password 123
set timeout 5#進(jìn)入命令行
spawn ssh $user@$ip
expect {"(yes/no)" {send "yes\r";exp_continue}
#這里捕獲兩次,表示該項(xiàng)被匹配之后,繼續(xù)匹配其他的指定的內(nèi)容
#類似于循環(huán)的continue,允許expect語句繼續(xù)向下執(zhí)行
"password" {send "$password\r"}
}
interact
實(shí)驗(yàn)效果
進(jìn)階版
#!/usr/bin/expect
set timeout 5
#使用位置變量,手動(dòng)輸入
set hostname [lindex $argv 0]
set password [lindex $argv 1]#進(jìn)入命令行
spawn ssh $hostname
expect {
#出現(xiàn)異常情況顯示實(shí)現(xiàn)
"NO route to host" {send_user "主機(jī)名/ip有誤\n"}
"Connection refusedi" {send_user "ssh連接拒絕\n"}
"(yes/no)" {send "yes\r";exp_continue}
"password" {send "$password\r"}
}
interact
8、小練習(xí)
免交互實(shí)現(xiàn)硬盤分區(qū),分一個(gè)區(qū)即可,分完之后,第一步要格式,第二步實(shí)現(xiàn)掛載,掛載(手動(dòng)掛載)然后在這個(gè)分區(qū)的掛載文件創(chuàng)建一個(gè)文件,寫入內(nèi)容“學(xué)習(xí)真好”,并且打印出結(jié)果,在一個(gè)腳本里完成,嵌入模式。
#!/bin/bash
# 使用shell
scan
# 列出所有塊設(shè)備
lsblk
set timeout 5
# 設(shè)置超時(shí)時(shí)間為5秒
/usr/bin/expect <<-EOF
spawn fdisk /dev/sdb
#進(jìn)行分區(qū)
expect "命令"
send "n\r"
expect "(default p)"
send "p\r"
expect "分區(qū)號(hào)"
send "1\r"
expect "起始 扇區(qū) "
send "\r"
expect "Last"
send "\r"
expect "(輸入 m 獲取幫助)"
send "w\r"expect eof
EOF
# 刷新分區(qū)表
partprobe /dev/sdb
# 列出所有塊設(shè)備以檢查新分區(qū) 以及過濾想要出現(xiàn)的分區(qū)
lsblk | grep sdb1 >& /dev/null
if [[ $? -eq 0 ]]
then
echo "分區(qū)被建立"
mkfs.xfs -f /dev/sdb1
mkdir /data1
mount /dev/sdb1 /data1
df -hT
else
echo "分區(qū)沒有被建立"
fi
#寫入內(nèi)容
cat >/data1/test1.txt <<EOF
學(xué)習(xí)真好
EOF
cat /data1/test1.txt
輸出效果
?