免交互
交互:我們發出指令控制程序的運行,程序在接收到指令后按照指令的效果作出對應的反應
免交互:間接的,通過第三方的方式把指令傳給程序,不用直接下達指令
Here Document免交互
這是命令行格式,也可以寫在腳本當中,通過l/O重定向的方式將命令的列表傳送給交互程序或者命令。
是標準輸出的一種替代品,代替了人工的輸入方式
語法格式
命令(linux的系統命令)<<標記
內容1
內容2
內容3
標記
wc -l <<xy102
> 123
> 456
> 789
> xy102
3
注意事項:
1、標記可以是任意合法字符(一般不用特殊字符,不以數字帶頭,通常以EOF作為默認的標記位)
2、結尾的標記一定要頂格寫,且前面不能有任何字符,空格也不行
3、結尾的標記后面也不能有空格
4、開頭的標記前后的空格都會被省略掉
文件插入 兩種方式 tee
[root@test1 opt]# cat <<EOF>>test1.txt
> 123
> 456
> 789
> EOF
[root@test1 opt]# cat test1.txt
123
456
789
[root@test1 opt]# tee test2.txt <<EOF
> 1
> 2
> 3
> 4
> 5
> 6
> EOF
1
2
3
4
5
6
[root@test1 opt]# cat test2.txt
1
2
3
4
5
6
引入變量
file="test1.sh"
i=school
cat >$file <<EOF
I am going to $i
EOF
sh 1.sh
[root@test1 opt]# cat test1.sh
I am going to school
整體變量賦值
vim 2.sh var="Great! I am going to school"
myvar=$(cat <<EOF
this is monday
$var
EOF
)
echo $myvar
運行腳本
sh 2.sh
this is monday Great! I am going to school
關閉免交互
vim 2.sh var="Great! I am going to school"
myvar=$(cat <<'EOF'
this is monday
$var
EOF
)
echo $myvar
sh 2.sh
this is monday $var
Expect實現免交互
用tcl語言寫的一個工具,主要用于自動化控制和測試,解決shell腳本交互的問題
rpm -q tcl expect
wh
轉義符
\n:換行
\r:回車
\t:相當于tab鍵
\b:表示退格,刪除
先安裝軟件
先賦權文件, ./才可以執行
./passed.sh
!/ure/bin/expect
聲明解釋器
set timeout 5
set設置timeout超時時間 默認是十秒設置超時時間五秒
set 也可以作為設置變量
spawn
后面需要執行的命令,開啟會話過程,并跟蹤后續的免交互信息
expect “新的密碼:”
捕獲需要執行的命令行,只要能夠捕獲即可,不需要完整的,可以用*代表所有
send “abc123\r”
輸入指令代碼
expect “重新輸入新的密碼:”
send “abc123\r”
結束語只能寫一個
expect eof
交互指令結束后,會退回原用戶,切換之前的用戶
interact
留在當前用戶
#!/usr/bin/expect# 設置超時時間為5秒
set timeout 5
# 執行更改用戶dn的密碼命令
spawn passwd dn
# 期待 "新的 密碼:" 提示
expect "新的 密碼:"
# 輸入新密碼(假設密碼是 "abc123")
send "abc123\r"
# 期待 "重新輸入新的 密碼:" 提示
expect "重新輸入新的 密碼:"
# 再次輸入新密碼
send "abc123\r"
# 期待命令結束
expect eof賦權
chmod 777 test1.sh
執行./test1.sh
spawn passwd dn
更改用戶 dn 的密碼 。
新的 密碼:
無效的密碼: 密碼少于 7 個字符
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新
切換用戶
設置超時時間
sed_user “ok”
sed_user = echo 打印指定內容
#!/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"
expect eof對文件進行賦權
chmod 777 su.sh
[root@test1 opt]# su test1
[test1@test1 opt]$ ./su.sh dn abc123
spawn su - dn
密碼:
[dn@test1 ~]$ ok[test1@test1 opt]$
嵌入執行模式
在shell當中加入expect,涉及到環境切換的場景不建議使用嵌套模式
ssh su不適合使用嵌入模式
#!/bin/bash
user=$1
password=$2
useradd $user
/usr/bin/expect <<EOF
spawn passwd $user
expect "新的"
send "password\r"
expect "重新"
send "password\r"
expect eof
EOFsh qiantao.sh mmm 123
spawn passwd mmm
更改用戶 mmm 的密碼 。
新的 密碼:
無效的密碼: 密碼未通過字典檢查 - 它基于字典單詞
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。
ssh免密登錄
連接固定主機
1、設置變量
連接主機
免交互實現硬盤分區
分完區
第一步要格式化
第二步實現掛載,手動掛載
在分區創建文件 寫入“學習真好” 打印結果
簡單的操作流程
#!/bin/bash/usr/bin/expect <<EOF
#設置分區
spawn fdisk /dev/sdd
expect "輸入 m 獲取幫助"
send "n\r"
expect "(default p): "
send "\r"
expect "(1-4,默認 1):"
send "\r"
expect "(2048-41943039,默認為 2048):"
send "\r"
expect "(2048-41943039,默認為 41943039):"
send "\r"
expect "輸入 m 獲取幫助"
send "w\r"expect eof
EOF
#刷新
partprobe
#創建文件系統
mkfs.xfs -f /dev/sdd1
#創建目錄
mkdir /opt/test4
#設置掛載點
mount /dev/sdd1 /opt/test4
echo "學習真好" > /opt/test4/test2.txt
cat /opt/test4/test2.txt