zoukankan      html  css  js  c++  java
  • 交互式命令 expect

    shell尽管很强大。但是貌似无法完成交互式命令的操作,实例 ssh host 如果host而且该机没有加入信任。手动输入的时间需要password。

    这样的情况下可以使用expect支持。


    下面举个样例来说明expect的功能与使用:


    功能:对集群各机器运行同样指令 如 集群ip 为 :192.168.6.1~192.168.6.10。须要在这10台机器上 同一时候 以tt用户登录 并运行 mkdir ttji_314命令。

    首先 定义一个hostlist文件 :

    192.168.6.1
    192.168.6.2
    192.168.6.3
    192.168.6.4
    192.168.6.5
    192.168.6.6
    192.168.6.7
    192.168.6.8
    192.168.6.9
    192.168.6.10


    然后定义一个 expect脚本 完毕在单个机器运行命令:ssh_comm.sh

    #!/usr/bin/expect				
    set host [lindex $argv 0]
    set command [lindex $argv 1]
    set password 123456
    set username tt
    set timeout 1
    
    
    send_user "connect to $host ...
    "
    spawn ssh -l $username $host
    
    
    expect "password:"
    send "$password
    "
    
    
    expect "#$"
    send "$command
    "
    
    
    expect "#$"
    send "exit
    "
    
    
    #interact
    expect eof


    几点说明 :

    1 首行加上/usr/bin/expect

    2 spawn: 后面加上须要运行的shell 命令
    3 expect: 仅仅有spawn 运行的命令结果才会被expect 捕捉到,由于spawn 会启
    动一个进程,仅仅有这个进程的相关信息才会被捕捉到。主要包含:标准输入的提
    示信息,eof 和timeout。

    4 send 和send_user:send 会将expect 脚本中须要的信息发送给spawn 启动
    的那个进程,而send_user 仅仅是回显用户发出的信息,类似于shell 中的echo 而
    已。
    5.set timeout 1之后的指令将都等待1s。

    最后完毕批量功能:command_all.sh
    #!/bin/bash
    
    function use() {
            echo "========================"
            echo "./command_all.sh hostlist command"
            echo "========================"
    }
    
    
    
    if [ $# != 2 ]
            then
                    use
            else
                    echo "welcome to use:
    "
    fi
    
    file=$1
    command=$2
    
    echo $file
    echo $command
    
    while read line
    do
        #echo $line
        ./ssh_comm.sh $line "$command"
    done < $file

    使用:
    ./command_all.sh hostlist "mkdir ttji_314"

    有个问题:当在expect脚本中 使用root用户登录的时候 似乎没有timeout这样的概念 ,运行完命令马上返回;

    而用普通用户才会有这样的体现。

    若有了解的同学请留言不吝赐教,不胜感激~害羞



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    零基础读懂视频播放器控制原理: ffplay 播放器源代码分析
    JPEG压缩原理与DCT离散余弦变换——有实际的数据演示
    图像压缩编码和解码原理——阐述了DCT变换的实质
    C++与C语言容易忽视的几个差异
    VLC目录结构介绍
    轻量便携流媒体播放器框架设计-2
    轻量便携流媒体播放器框架设计-1
    rtmp和rtsp的区别和适用范围
    vlc源码分析(六) 调用OpenMAX硬解码H.265
    vlc源码分析(五) 流媒体的音视频同步
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4840715.html
Copyright © 2011-2022 走看看