zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    docker 方式安装gitlab时,项目的clone地址及项目文件列表地址为机器名的问题解决办法
    CPU流水线
    Element中el-form嵌套el-table双击编辑提交检验
    java基础知识
    C#多线程下载
    mysql优化
    C++ 算法(一)
    前端vue 的面试总结 以及答案以及前端技术点面试
    C# 组合任务
    C# List去重DistinctBy扩展
  • 原文地址:https://www.cnblogs.com/wxl-dede/p/5009214.html
Copyright © 2011-2022 走看看