zoukankan      html  css  js  c++  java
  • linux expect详解

    linux 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         设置超时时间
    interact        允许用户交互
    复制代码
    复制代码

    示例:

    1.ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh

    # vim 1.sh 

    复制代码
    #!/usr/bin/expect
    
    spawn ssh saneri@192.168.56.103 df -Th
    expect "*password"
    send "123456
    "
    expect eof
    复制代码

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

    复制代码
    复制代码
    #!/bin/bash
    
    passwd='123456'
    
    /usr/bin/expect <<-EOF
    
    set time 30
    spawn ssh saneri@192.168.56.103 df -Th
    expect {
    "*yes/no" { send "yes
    "; exp_continue }
    "*password:" { send "$passwd
    " }
    }
    expect eof
    EOF
    复制代码
    复制代码

    3.expect执行多条命令

    复制代码
    复制代码
    #!/usr/bin/expect -f
    
    set timeout 10
    
    spawn sudo su - root
    expect "*password*"
    send "123456
    "
    expect "#*"
    send "ls
    "
    expect "#*"
    send "df -Th
    "
    send "exit
    "
    expect eof
    复制代码
    复制代码

    4. 创建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
    ";exp_continue }
            "password" { send "$passwd
    " }
          }
         expect "password" { send "$passwd
    " }
    EOF
      done <  hosts
    复制代码
    复制代码

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

    复制代码
    复制代码
    #!/bin/bash 
    ip=$1  
    user=$2 
    password=$3 
    
    expect <<EOF  
        set timeout 10 
        spawn ssh $user@$ip 
        expect { 
            "yes/no" { send "yes
    ";exp_continue } 
            "password" { send "$password
    " }
        } 
        expect "]#" { send "useradd hehe
    " } 
        expect "]#" { send "touch /tmp/test.txt
    " } 
        expect "]#" { send "exit
    " } expect eof 
     EOF  
     #./ssh5.sh 192.168.1.10 root 123456 
  • 相关阅读:
    Java实现 计蒜客 拯救行动
    Java实现 计蒜客 拯救行动
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 173 二叉搜索树迭代器
    Java实现 LeetCode 173 二叉搜索树迭代器
    Visual Studio的SDK配置
    怎样使用CMenu类
    mfc menu用法一
  • 原文地址:https://www.cnblogs.com/lgj8/p/12971581.html
Copyright © 2011-2022 走看看