收藏文章 楼主

linux expect 自动化插件详解

版块:linux   类型:置顶   作者:小绿叶技术博客   查看:2286   回复:0   获赞:4   时间:2020-05-31 19:46:41

 expect  [ɪkˈspɛkt] 预期;自动化插件与linux交互命令 

spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.

1.   expect 常用命令

spawn                交互程序开始后面跟命令或者指定程序

expect              获取匹配信息匹配成功则执行expect后面的程序动作

send exp_send        用于发送指定的字符串信息

exp_continue        在expect中多次匹配就需要用到

send_user            用来打印输出 相当于shell中的echo

exit                退出expect脚本

eof                  expect执行结束 退出

set                  定义变量

puts                输出变量

set timeout          设置超时时间

interact      允许用户交互


2.   ssh登录远程主机并且执行命令

#!/bin/bash

yum install -y expect

                # 安装交互工具包

set timeout 30

                # 设置匹配字符的等待时间

/usr/bin/expect << EOF

                # 执行交互程序,通过EOF 打包给程序


spawn ssh root@eisc.cn

                # 进行远程连接服务器


expect "password:"

                # 匹配密码提示

send "000000\r"

                # 输入密码并换行



expect "#"

                # 登录成功后匹配符号 #

send "echo '登录成功' \r"

                # 执行打印命令并换行



expect eof

                # 匹配结束

# exit

                # 退出

EOF

                # 总打包结束


3.   ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行

#!/bin/bash


passwd='tytyt123456' # 定义一个变量为字符串


# -EOF 输入多行命令 

  # 调用命令的路径:/usr/bin/expect <<-EOF 

/usr/bin/expect <<-EOF


spawn ssh saneri@192.168.56.103 df -Th

# 执行两个命令

# 定义一个函数,名字为: expect

expect {

"*yes/no" { send "yes\r"; exp_continue }

"*password:" { send "$passwd\r" }

}

expect eof # 将函数名字放出来执行,并结束匹配

EOF #  总结束



4.   expect执行多条命令

#!/usr/bin/expect -f


set timeout 10


spawn sudo su - root # 切换用户

expect "*password*" # 匹配包含字符password后

send "123456\r" # 输入123456 并 /r 确定  也可以 \n  换行确定

# 新增用户命令: useradd eisc

expect "#*"

send "ls\r"


send "exit\r"

expect eof


5.   创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。

1.创建主机配置文件


[root@localhost script]# cat host 

192.168.1.10 root 123456

192.168.1.20 root 123456

192.168.1.30 root 123456


[root@localhost script]# ls

copykey.sh  hosts

2.编写copykey.sh脚本,自动生成密钥并分发key.

[root@localhost script]# vim copykey.sh


#!/bin/bash


# 判断id_rsa密钥文件是否存在

if [ ! -f ~/.ssh/id_rsa ];then

 ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

else

 echo "id_rsa has created ..."

fi


#分发到各个节点,这里分发到host文件中的主机中.

while read line

  do

    user=`echo $line | cut -d " " -f 2`

    ip=`echo $line | cut -d " " -f 1`

    passwd=`echo $line | cut -d " " -f 3`

    

    expect <<EOF

      set timeout 10

      spawn ssh-copy-id $user@$ip

      expect {

        "yes/no" { send "yes\n";exp_continue }

        "password" { send "$passwd\n" }

      }

     expect "password" { send "$passwd\n" }

EOF

  done <  hosts

6.    shell调用expect执行多行命令.

#!/bin/bash 

ip=eisc.cn

user=root

password=www.eisc.cn


expect <<EOF  

    set timeout 10 

    spawn ssh $user@$ip 

    expect {  # 多个匹配用大括号来省略单词expect

        "yes/no" { send "yes\n";exp_continue } 

        "password" { send "$password\n" }

    } 

    expect "]#" { send "useradd hehe\n" } 

# 匹配符号   ]#    为登陆后的界面

    expect "]#" { send "touch /tmp/test.txt\n" } 

    expect "]#" { send "exit\n" } expect eof 

 EOF  

 #./ssh5.sh 192.168.1.10 root 123456


有些梦虽然遥不可及,但并不是不可能实现。 
回复列表
默认   热门   正序   倒序

回复:linux expect 自动化插件详解

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息