zoukankan      html  css  js  c++  java
  • 10非交互expect

    非交互expect

    介绍expect

    认识expect

    expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

    expect自动交互流程

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

    expect常用命令总结

    spawn               交互程序开始后面跟命令或者指定程序
    expect              获取匹配信息匹配成功则执行expect后面的程序动作
    send exp_send       用于发送指定的字符串信息
    exp_continue        在expect中多次匹配就需要用到
    send_user           用来打印输出 相当于shell中的echo
    exit                退出expect脚本
    eof                 expect执行结束 退出
    set                 定义变量
    puts                输出变量
    set timeout         设置超时时间
    

    安装expect

    [root@hadoop04 ~]# yum -y install expect
    

    编写expect脚本

    初始版

    [root@hadoop04 shell_expect]# vim expect_ssh01.sh
    #!/usr/bin/expect
    
    #开启一个会话
    spawn ssh alice@172.22.34.19
    
    expect {
            "yes/no" { send "yes
    ";exp_continue }
            "password" { send "5tgb^YHN
    " };
    }
    # 停留在远程机器的界面
    interact
    
    [root@hadoop04 shell_expect]# expect expect_ssh01.sh 
    

    改进版1

    增加变量定义、变量引用

    [root@hadoop04 shell_expect]# vim expect_ssh02.sh
    #!/usr/bin/expect
    
    # 定义变量
    set ip 172.22.34.19
    set user alice
    set password 5tgb^YHN
    set timeout 5
    
    #开启一个会话
    spawn ssh ${user}@${ip}
    
    expect {
            "yes/no" { send "yes
    ";exp_continue }
            "password" { send "${password}
    " };
    }
    
    interact
    
    [root@hadoop04 shell_expect]# expect expect_ssh02.sh 
    spawn ssh alice@172.22.34.19
    alice@172.22.34.19's password: 
    Last login: Tue Dec 10 22:00:03 2019 from 172.22.34.20
    [alice@hadoop03 ~]$  
    

    改进版2

    位置参数作为变量值赋值给变量,进入到远程机器后,创建测试文件test.txt,查看当前目录,退出远程机器,结束expect

    [root@hadoop04 shell_expect]# vim expect_ssh03.sh
    #!/usr/bin/expect
    
    # 定义变量
    # 第一个位置参数
    set ip [lindex $argv 0]
    set user alice
    set password 5tgb^YHN
    set timeout 5
    
    #开启一个会话
    spawn ssh ${user}@${ip}
    
    expect {
            "yes/no" { send "yes
    ";exp_continue }
            "password" { send "${password}
    " };
    }
    
    #interact
    
    expect "$"
    send "touch test.txt
    "
    send "ls
    "
    send "pwd
    "
    send "exit
    "
    
    # 结束expect
    expect eof
    
    
    # 执行脚本
    [root@hadoop04 shell_expect]# expect expect_ssh03.sh 172.22.34.19
    spawn ssh alice@172.22.34.19
    alice@172.22.34.19's password: 
    Last login: Tue Dec 10 21:59:53 2019 from 172.22.34.20
    [alice@hadoop03 ~]$ touch test.txt
    [alice@hadoop03 ~]$ ls
    test.txt
    [alice@hadoop03 ~]$ pwd
    /home/alice
    [alice@hadoop03 ~]$ exit
    logout
    Connection to 172.22.34.19 closed.
    

    改进版3

    批量主机推送公钥推送

    #!/usr/bin/bash 
    
    ip_file=ip.txt
    password=feidee.com
    
    >${ip_file}
    
    for i in {16..19}
    do
            {
                    ip=172.22.34.${i}
                    ping -c1 -W1 ${ip} &> /dev/null
                    if [ $? -eq 0 ];then
                            echo "${ip}" >> ${ip_file}
                            # 使用expect推送公钥
                            /usr/bin/expect <<-EOF
                            spawn ssh-copy-id ${ip}
                            expect {
                                    "yes/no" { send "yes
    "; exp_continue }
                                    "password:" { send "${password}
    " }
                            }
                            expect eof
                            EOF
                    fi
            }&
    done
    
    wait
    
    echo "All finish..."
    

    改进版4

    批量主机推送公钥推送,添加兼容:expect未安装时先安装expect,密钥未创建时先创建密钥

    #!/usr/bin/bash 
    
    ip_file=ip.txt
    password=feidee.com
    
    >${ip_file}
    
    # 检查expect是否安装
    rpm -q expect &> /dev/null
    
    if [ $? -eq 0 ];then
    	echo "正在安装expect,请稍候..."
    	yum -y install expect &> /dev/null && echo "expect 安装完成." 
    fi
    
    # 检查密钥是否存在
    if [ ! -f  ~/.ssh/id_rsa ];then
    	echo "正在创建密钥,请稍后..."
    	# 非交互式的ssh-keygen
    	ssh-keygen -P "" -f ~/.ssh/id_rsa &> /dev/null  && echo "密钥创建成功"
    fi
    
    
    
    for i in {16..19}
    do
    	{
    		ip=172.22.34.${i}
    		ping -c1 -W1 ${ip} &> /dev/null
    		if [ $? -eq 0 ];then
    			echo "${ip}" >> ${ip_file}
    			# 使用expect推送公钥
    			/usr/bin/expect <<-EOF
    			spawn ssh-copy-id ${ip}
    			expect {
    				"yes/no" { send "yes
    "; exp_continue }
    				"password:" { send "${password}
    " }
    			}
    			expect eof
    			EOF
    		fi
    	}&
    done
    
    wait
    
    echo "All finish..."
    
  • 相关阅读:
    tomcat架构分析和源码解读
    时代和命运,选择和放弃
    Python中的test测试
    python装饰器语法
    网上传言:程序员 = 宅男,程序员真的都宅吗?现实情况是这样!
    编程初学者,哪几种编程语言最值得你去学习?其实你应该这样做!
    C/C++编程笔记:《C语言》—— 数组知识详解,学编程建议收藏!
    细数程序员 10 种“辛酸与无奈”,程序员网友直言:这也太真实了!
    程序人生丨程序员的发展之路,怎样的发展决定你拥有怎样的薪资!
    程序人生丨提问环节面试官让程序员提问,五个程序员问这些,直接录取!
  • 原文地址:https://www.cnblogs.com/ElegantSmile/p/12164772.html
Copyright © 2011-2022 走看看