目录
绪论
免交互:不需要人为控制就可以完成的自动化操作(自动化运维)
1、here Document免交互
使用i/o(输入/输出)重定向的方式,将命令的列表提供给交互式的程序或者命令
cat read 是一种标准输入,只能接受正确的指令或者命令
1.1 格式
命令 <<标记
...
...
标记
eg:
注意事项
· 标记可以使用人以合法字符(通常用EOF)
· 结尾的标记一定要顶格写,前面不能有任何字符
· 结尾的标记后面,也不能有任何字符,包括空格
· 如果开头的标记前有空格,这个空格会被自动省略
eg:read i <<EOF read只能输入一次
>123
>EOF
echo $i
1.2 cat结合免交互实现重定向输出到指定文件
1.3 变量替换
vim test.sh进入编辑
#!/bin/bash
file="test.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF 保存退出
2、Expect免交互
tcl语言基础之上的一种工具,自动化测试和控制,在脚本中解决交互的问题
转义符:\n 换行 \t制表符,tab键 \r回车 \b退格键,就是删除键
基本命令格式: #!/usr/bin/expect
语法:
· spawn后面通常跟一个linux的执行命令,表示开启一个会话,启动一个进程,并且跟踪后续的交互信息
· expect,捕获,上一次执行的命令中,是否包含指定的字符串,如果有立即返回,否则等待超时,自动退出(默认超时时间为10s)
· expect 只能捕获由spawn启动的进程输出
· send 向进程发送字符串,用于模拟用户的输入,该命令不能自动回车,一般后面加一个回车键:\r 或者\n
2.1 三种写法
第一种写法
#!/use/bin/expect
set timeout 5
spawn passwd lisi
expect "新的密码"
send "abc123\r"
expect "重新输入新的密码"
send "abc123\r"
expect eof
第二种写法
#!/use/bin/expect
set timeout 5
spawn passwd lisi
expect "New password" {send "123\r"}
expect "Retype new password" {send "123\r"}
expect eof
第三种写法:多分支结构
#!/use/bin/expect
set timeout 5
spawn passwd lisi
expect
{
"密码1"{send "abc123\r"}
"密码2"{send "abc123\r"}
"密码3"{send "abc123\r"} 只要匹配其中一个情况,执行相应的send语句,然后退出
}
结束符
expect eof 会切换回之前的终端
interact 留在当前终端不变
set 设置超市等待时间,默认是10s
set timeout 5 -1()则表示永不超时
3、免交互实现普通用户切换root
vim qiehuan.sh
#!/usr/bin/expect
set timeout 5
spawn su root
expect "passwd"
send "123\r"
expect eof 保存退出
chmod 777 目录
su - lisi
sh qiehuan.sh
expect_continue 可以在expect判断之后,继续匹配expect,捕获的其他内容,类似于脚本中continue,表示允许继续向下执行指令
使用expect_continue的结束语不能使用expect eof
expect {
"(yes/no)" {send "yes\r";exp_continue}
"passwd" {send"123\r"}
}
3.1 send_user
send_user 会先信息,相当于echo跟上用户想要输出的内容
4、接收参数
类似于shell当中的位置变量$1 $2
set hostname [linux $argv 0] $1
set password [linux $argv 0] $2
eg:
set timeout 5
set usr [lindex $argv 0]
set passwd [lindex $argv 1]
spawn su - $user
expect "密码" (或者passwd)
send "$passwd\r"
expect "]$"
send_user "普通用户"
expect "]#"
send_user "管理员"
interact
保存退出
./qiehuan lisi 123
5、嵌入执行模式
如果涉及终端切换,最好不要用嵌入模式
将expect过程融入shell中,方便执行和处理
eg:vim useradd.sh
#!/bin/bash
user=$1
passwd=$2
useradd $user
/usr/bin/expect << -EOF
#expect 开始表示
spawn passwd $user
expect "新的*"
send "${passwd}\r"
expect "重新*"
send "${passwd}\r"
expect eof
EOF
保存退出
sh useradd.sh lisi 123
6、ssh远程登录
#!/usr/bin/expect
set ip 192.168.233.30 #指定远程登录的ip地址
set user root
#指定为root用户
set password 123
#设定密码为123
set timeout 5
spawn ssh $user@$ip
expect {
"yes/no" isend "yes\r" ;exp_continue}
"password" isend " $password\r" }
}
expect eof
保存退出
chmod 777 ssh.sh
./ssh.sh
6.1 通过传参的方式实现
#!/usr/bin/expect
set name [lindex $argv 0]
set ip [lindex $argv 1]
set password [lindex $argv 2]
set timeout 5
spawn ssh
$name@$ip
expect {
"refused" {send_ _user "访问被拒绝\r"}
"No route to host" {send_ _user "主机名或者ip地址有误\n"}
"yes/no" {send "yes\r" ;exp_ continue}
password" {send " $password\r"}
}
expect eof
保存退出
./ssh.sh root 20.0.0.30 123