linux 之免交互操作
一、Here Document免交互
1.1 免交互定義
Here Document 概述:
使用I/O重定向的方式將命令列表提供給交互式程序或命令,比如 ftp、cat 或 read 命令
Here Document 是標(biāo)準(zhǔn)輸入的一種替代品,可以幫助腳本開發(fā)人員不必使用臨時文件來構(gòu)建輸入信息,而是直接就地 生產(chǎn)出一個文件并用作命令的標(biāo)準(zhǔn)輸入,Here Document 可以與非交互式程序和命令一起使用
1.2 語法格式
語法格式
命令 << 標(biāo)記
....
輸入內(nèi)容
......
標(biāo)記
Here Document 使用注意事項:
?標(biāo)記可以使用任意的合法字符(通用的字符是EOF) ?結(jié)尾的標(biāo)記一定要頂格寫,前面不能有任何字符(包括空格) ?結(jié)尾的標(biāo)記后面也不能有任何字符(包括空格) ?開頭標(biāo)記前后空格會被省略掉 ?
1.3 實例
1.直接把輸入的命令行輸出 ?2.將輸入的內(nèi)容保存到文件 ?3.追加內(nèi)容輸入保存到文件
1.4 Here Document 變量設(shè)定
Here Document 也支持使用變量,如果標(biāo)記之間有變量被使用,會先替換變量值。如 果想要將一些內(nèi)容寫入文件,除了常規(guī)的方法外,也可以使用 Here Document。如果寫入 的內(nèi)容中包含變量,在寫入文件時要先將變量替換成實際值,在結(jié)合 cat 命令完成寫入
示例:
1.在寫入文件時會先將變量替換成實際值,再結(jié)合cat 命令完成寫入 ?2.支持變量替換 在寫入文件時會先將變量替換成實際值,再結(jié)合 cat 命令完成寫入
[root@localhost ~]# vim kk.sh
#!/bin/bash
doc_file="yy.txt"
i="0.0"
cat > $doc_file << EOF
kuai le $i
EOF
echo ?this is $i
[root@localhost ~]# chmod +x kk.sh
[root@localhost ~]# ./kk.sh
this is 0.0
[root@localhost ~]# cat yy.txt
kuai le 0.0
3.整體賦值給一個變量,然后通過 echo 命令將變量值打印出來
[root@localhost ~]# vim kk.sh
#!/bin/bash
ar="So Happy"
arr=$(cat << EOF
放假
$ar
EOF
)
echo $arr
[root@localhost ~]# chmod +x kk.sh
[root@localhost ~]# ./kk.sh
放假 So Happy
1.5 格式控制
關(guān)閉變量替換的功能,按照字符原本的樣子輸出,不做任何修改或替換
示例:
1.關(guān)閉變量替換: 對標(biāo)記加單引號,即可關(guān)閉變量替換 ?
[root@localhost ~]# vim kk.sh
#!/bin/bash
i="hello"
kk=$(cat <<'EOF'
$i
EOF
)
echo $kk
[root@localhost ~]# chmod +x kk.sh
[root@localhost ~]# ./kk.sh
$i
1234567891011121314
?2.去掉每行之前的 tab 字符 在第一行的標(biāo)記前面加 ‘-’,這個表示要抑制各行首 tab 的作用
[root@localhost ~]# vim kk.sh
#!/bin/bash
cat <<EOF
????????hello world
EOF
cat <<-EOF
????????hello world
EOF
[root@localhost ~]# chmod +x kk.sh
[root@localhost ~]# ./kk.sh
hello world
hello world
1234567891011121314
1.6 多行注釋
Bash 的默認(rèn)注釋是 “#” ,該注釋方法只支持單行注釋,在shell 腳本的工作中,"#"右側(cè)的任何字符串,bash都會將其忽略。Here Document 的引入解決了多行注釋的間題。 " : " (冒號) 代表什么都不做的空命令。中間標(biāo)記區(qū)域的內(nèi)容不會被執(zhí)行,會被bash 忽略掉,因此可達(dá)到批量注釋的效果.
[root@localhost ~]# vim kk.sh
#!/bin/bash
a=123456
: <<-EOF
this is
test line
echo $a
EOF
echo "0.0"
[root@localhost ~]# chmod +x kk.sh
[root@localhost ~]# ./kk.sh
0.0
二、Expect
2.1 Expect 定義
?建立在tcl之上的一個工具 ?用于進行自動化控制和測試 ?解決shell腳本中交互相關(guān)的問題 ?
2.2 Expect 安裝
rpm -q expect
rpm -q tcl
yum install -y expect
12345
2.3 Expect 相關(guān)命令
腳本解釋器
expect 腳本中首先引入文件,表明使用的事哪一種shell#!/usr/bin/expect
spawn
spawn后面通常跟一-個Linux執(zhí)行命令,表示開啟一個會話、啟動進程,并跟蹤后續(xù)交互信息 例: spawn passwd root
expect
判斷上次輸出結(jié)果中是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回;只能捕捉由spawn啟動的進程的輸出;用于接收命令執(zhí)行后的輸出,然后和期望的字符串匹配
send
?向進程發(fā)送字符串,用于模擬用戶的輸入; ?該命令不能自動回車換行,一般要加\r (回車)或者\n ?
結(jié)束符
1.expect eof
?表示交互結(jié)束,等待執(zhí)行結(jié)束,退回到原用戶,與spawn對應(yīng) ?比如切換到root用戶,expect腳本默認(rèn)的是等待10s當(dāng)執(zhí)行完命令后,默認(rèn)停留10s后,自動切回了原用戶 ?
2.interact
1.執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺, 會停留在目標(biāo)終端而不會退回到原終端,這個時候就可以手工操作了,interact后的命.令不起作用;
?比如interact后添加exit,并不會退出root用戶。而如果沒有interact則登錄完成后會退出,而不是留在遠(yuǎn)程終端上。 ?使用interact會保持在終端而不會退回到原終端; ?
set
?expect 默認(rèn)的超時時間是10秒,通過set 命令可以設(shè)置會話超時時間,若不限制超時時間則應(yīng)設(shè)置為-1 ?例子: set time out 30 ?
exp_continue
exp_ continue 類似于控制語句中的continue 語句。表示允許expect 繼續(xù)向下執(zhí)行指令
send_users
表示回顯命令與echo相同
接收參數(shù)
expect 腳本可以接受從bash命令行傳遞參數(shù),使用 [lindex $argv n]獲得。其中你從0開始,分別表示第一個,第二個,第三個…參數(shù)
set hostname [lindex $argv 0] 相當(dāng)于hostname=$1
set password [lindex $argv 1] 相當(dāng)于passswd=$2
2.4 實例
1.ssh無交互登錄到遠(yuǎn)程服務(wù)器
[root@localhost ~]# vim kk.sh
#!/usr/bin/expect
spawn ssh root@192.168.146.10
expect {
????????"password:"
????????{ send "123456\r"; }
}
interact
[root@localhost ~]# chmod +x kk.sh
[root@localhost ~]# ./kk.sh
spawn ssh root@192.168.146.10
root@192.168.146.10's password:
Last login: Mon Feb 14 12:12:35 2022 from 192.168.146.20
[root@localhost ~]#
2.在遠(yuǎn)程登錄的服務(wù)器上進行操作后再退出
[root@localhost ~]# vim kk.sh
#!/usr/bin/expect
spawn ssh root@192.168.146.10
expect {
????????"password:"
????????{ send "123456\r"; }
}
expect "#"
send "ls\r"
send "ifconfig ens33\r"
send "exit\r"
expect eof
[root@localhost ~]# chmod +x kk.sh
[root@localhost ~]# ./kk.sh
spawn ssh root@192.168.146.10
root@192.168.146.10's password:
Last login: Mon Feb 14 16:42:02 2022 from 192.168.146.20
[root@localhost ~]# ls
anaconda-ks.cfg ?initial-setup-ks.cfg
[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> ?mtu 1500
????????inet 192.168.146.10 ?netmask 255.255.255.0 ?broadcast 192.168.146.255
????????inet6 fe80::33b3:2fac:9c4b:5e89 ?prefixlen 64 ?scopeid 0x20<link>
????????ether 00:0c:29:01:3e:a5 ?txqueuelen 1000 ?(Ethernet)
????????RX packets 210547 ?bytes 310074122 (295.7 MiB)
????????RX errors 0 ?dropped 0 ?overruns 0 ?frame 0
????????TX packets 98024 ?bytes 5939781 (5.6 MiB)
????????TX errors 0 ?dropped 0 overruns 0 ?carrier 0 ?collisions 0
[root@localhost ~]# exit
登出
Connection to 192.168.146.10 closed.
?3.ssh 免交互登錄的第二種寫法
[root@localhost ~]# vim kkk.sh
#!/usr/bin/expect
set timeout 10
log_file kkk.log
log_user 1
set ip [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh root@${ip}
expect {
????????"(yes/no)"
????????{send "yes\r"; exp_continue} "*password"
????????{send "$password\r"}
}
interact
??
[root@localhost ~]# chmod +x kkk.sh
[root@localhost ~]# ./kkk.sh 192.168.146.10 123456
spawn ssh root@192.168.146.10
root@192.168.146.10's password:
Last login: Mon Feb 14 21:57:36 2022 from 192.168.146.20
[root@localhost ~]# ??????
[root@localhost ~]# vim yong.sh
#!/bin/bash
username=$1
useradd $username
/usr/bin/expect <<-EOF
spawn passwd $username
expect {
????????"密碼"
????????{send "123456\r";exp_continue}
????????"新的密碼"
????????{send "123456\r";}
}
EOF
[root@localhost ~]# chmod +x yong.sh
[root@localhost ~]# ./yong.sh nan
spawn passwd nan
更改用戶 nan 的密碼 。
123456
新的 密碼:
無效的密碼: 密碼少于 8 個字符
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經(jīng)成功更新。
[root@localhost ~]# vim ftp.sh
#!/usr/bin/expect -f
set timeout 10
spawn ftp 192.168.146.10
expect "Name*"
send "ftp\r"
expect "Passwd:*"
send "\r"
expect "ftp>*"
interact
[root@localhost ~]# chmod +x ftp.sh
[root@localhost ~]# ./ftp.sh
spawn ftp 192.168.146.10
Connected to 192.168.146.10 (192.168.146.10).
220 (vsFTPd 3.0.2)
Name (192.168.146.10:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
總結(jié)
以上是生活随笔為你收集整理的linux 之免交互操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web -httpd
- 下一篇: iptables 防火墙