• shell expect


    关键的action

    spawn     调用要执行的命令
    expect     捕捉用户输入的提示
    send        发送需要交互的值,替代了用户手动输入内容
    set           设置变量值

    interact 执行完成后保持交互状态,把控制权交给控制台

    expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

    expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

    set timeout -1    设置expect永不超时

    set timeout 300    设置expect 300秒超时,如果超过300没有expect内容出现,则推出

    实例一:部署简单的apache,部署的脚本事先写好,expect先登录主机在远程scp到脚本本地,执行脚本

    #!/usr/bin/expect

     

    set ip [lindex $argv 0]                #注意:$argv 0 是第一个参数,不是脚本名

    set name [lindex $argv 1]

                                     #三种情况:直接输密码;

                        #从未登录远程的主机,需要输入yes确认

    #远程主机不可达

    spawn ssh root@$ip

    expect "(yes/no)?" {

    send "yes "

    expect "password:"

    send "redhat "

    } "password:" {send "redhat "} "* host" {exit 1}        

     

    #注意每个expect的情况,中间一定有个空格

     

    expect "#"

    #scp apache的部署脚本

    send "scp root@172.25.12.250:/home/wxl/Desktop/shell/apache.sh /mnt "    

    expect "(yes/no)?" {

    send "yes "

    expect "password:"

    send "redat "

    } "password:" { send "redhat " }

    expect "#"

    send "sh /mnt/apache.sh $name;exit "

    expect eof                                    #结束标志,关闭对话

     

    foreach的用法:相当于数组这么个概念。为数组中的每个元素都执行下面动作

    实例二

    [root@server1 note]# cat sshv.sh

    #!/usr/bin/expect

     

    foreach ip {

    192.168.88.121

    192.168.88.123

    } {

    spawn ssh root@$ip

    expect "(yes/no)?" {

    send "yes "

    expect "password:"

    send "redhat "

    } "password:" {send "redhat "} "* host" {exit 1}

     

    expect "#"

    send "hostname;exit "

    expect eof

    }

     

    shell脚本和expect的结合但是expect脚本里最好指定解释器

    实例三:从文件中读取账户密码,expect自动登录,进行操作;

    shell程序:

    #!/bin/bash

    for ip in `awk '{print $1}' passwd.txt`

    do

    pass=`awk -v i="$ip" '{if(i==$1)print $2}' passwd.txt`        

    #-v设定变量, 如果当前行的$1就是ip和所设定的变量ip(原来的$1)

    #那么就取出$2(密码)

    expect vssh.sh $ip $pass

    done

     

    expect程序:

        和实例一差不多。

    pass.txt:

        172.25.12.11 redhat

      172.25.254.18 centos

  • 相关阅读:
    创建git项目的feature分支以及下载特定分支的仓库代码
    C++读取文件
    linux解压eclipse启动时无法找到jre环境的解决办法
    ubuntu安装谷歌浏览器
    web项目脱离Eclipse在Tomcat部署并配置Eclipse调试
    阿里巴巴连接池Druid简单使用
    gc overhead limit exceeded
    onload方法注意点
    获取Spring管理的Bean
    Java应用中使用ShutdownHook友好地清理现场
  • 原文地址:https://www.cnblogs.com/wxl-dede/p/5009214.html
Copyright © 2020-2023  润新知