免交互
交互:發出指令控制指令的運行,程序再接收到指令的效果做出對應的反應。
免交互:間接的,通過第三方的方式把指令傳送給程序,不用直接的下達指令
Hhere Document 免交互
這是命令行格式,也可以寫在腳本當中。通過I/O重定向的方式將命令傳送給交互式程序或指令
是標準輸入的一種替代品。代替了人工的輸入方式。
語法格式:
命令(Linux的系統命令) <<標記
內容1
內容2
內容3
標記
注意事項:
1、標記可以是任意合法字符(一般不用特殊字符,不以數字開頭,通常以EOF作為默認的標記位)
2、結尾的標記一定要頂格寫,且前面不能有任何字符,空格也不行
3、結尾的標記后面也不能有任何字符,包括空格
4、開頭的標記前后的空格都會被省略
read i << EOF
> 22
> EOF
cat <<EOF>>test2.txt
> 123
> 456
> 789
> EOF
tee test3.txt <<EOF
> 1
> 2
> 1
> 2
> EOF
vim mjh.sh
#!/bin/bash
#引入變量
file="test1.sh"
i=school
cat > $file <<EOF
i am going to $i
EOF
sh mjh.sh
cat test1.sh
#!/bin/bash
#整體變量賦值
var="good!"
myvar=$(cat <<EOF
#myvar=$(cat <<'EOF' 不向文件內傳輸
this school is beautiful
$var
EOF
)
echo $myvar
Expect實現免交互
用tcl語言寫的一個工具,主要用自動化控制和測試。解決shell腳本交互的問題。
yum install -y expect
轉義符
\n:換行
\r:回車
\t:相當于一個tab鍵
\b:backspace表示退格,刪除
vim passwd.sh
#!/usr/bin/expect
set timeout 5
#set相當于設置,timeout超時時間,expect有一個默認的超時時間10s。設置超時時間5s
#set也可以作為設置變量
spawn passwd dn
#spawn后面用來聲明需要執行的命令,開啟會話過程,并且跟蹤后續的交互信息。
expect "新的密碼:"
#捕獲需要執行的命令行,只要能夠捕獲即可,不需要完整的,可以用*代表所有
send "123\r"
#輸入指令代碼
expect "重新輸入新的密碼"
send "123\r"
#最后一定要有結束語,結束語只能寫一個
expect eof
#交互指令結束以后,會退回原用戶,切換回之前的用戶
interact
#留在當前用戶不會變
chmod 777 passwd.sh
./passwd.sh
vim su.sh
#!/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"
#sed_user = echo 打印指定內容
#結束語
interact #留在當前用戶不會變
chmod 777 su.sh
./su.sh 用戶 密碼
嵌入執行模式,在shell中加入expect,涉及到環境切換的場景不建議使用嵌套。
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
#!/usr/bin/expect
set ip 192.168.233.10
set user root
set password 123
set timeout 5
#進入命令行交互
spawn ssh $user@$ip
expect {
"yes/no" {send "yes\r";exp_continue}
#這里捕獲兩次,表示該項被匹配之后,繼續匹配其他的指定內容。類似于循環的continue。允許expect語句繼續向下執行。
"password" {send "$password\r"}
}
interact
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
#進入命令格式
spawn ssh $hostname
expect {
"No route to host" {send_user "主機名/ip有誤\n"}
"Connection refusedi" {send_user "ssh連接拒絕\n"}
"(yes/no)" {send "yes\r";exp_continue}
"password" {send "$password\r"}
}
interact