美文网首页
十、expect 自动交互

十、expect 自动交互

作者: 胖虎喜欢小红 | 来源:发表于2020-01-05 15:26 被阅读0次

    expect 内部命令

    语法结构

    spawn   shell 命令程序 
    
    expect   "捕获到shell 命令程序执行之后输出的字符串"  
    send  "发送给 shell 命令程序的字符串"
    

    在命令行直接输入 expect 可以进入 expect 程序的解释器终端

    [root@e5ac44e88027 ~]# expect
    expect1.1> spawn echo "hello"   # 发送一条 shell 命令, 这里是指 echo "hello"
    spawn echo hello
    1490
    expect1.2> expect "hello"     # 捕获这个字符串,只要包含这个字符串就可以
    hello
    expect1.3> send "yes\n"      # 发送一个字符串
    expect1.4> expect off           # 结束这次捕获
    yes
    expect1.5>
    

    在脚本中使用

    # 开始 expect  解释器程序
    /usr/bin/expect<<EOF
    
    # 设置捕获字符串后,期待回复的超时时间
    set timeout 30
    
    spawn   ssh-keygen
    
    # 开始进连续捕获
    expect     {
            ".ssh/id_rsa)"       { send    "\n";  exp_continue }
            "Overwrite (y/n)?"   { send    "y\n"; exp_continue }
            "no passphrase):"    { send    "\n";  exp_continue }
            "again:"             { send    "\n";  exp_continue }
    }
    
    # 结束 expect 解释器程序
    EOF
    

    ".ssh/id_rsa)" { send "\n"; exp_continue }
    意思是 捕获到字符串 ".ssh/id_rsa)" 后 发送字符串 "\n" 就是相当于按下回车键
    exp_continue 意思是继续进行捕获,不退出 expect 程序

    实战案例

    # 写个用于自动生成密钥对的函数
    auto_keygen (){
        /usr/bin/expect<<EOF
    
        set timeout 30
    
        spawn   ssh-keygen
    
        expect     {
    
            ".ssh/id_rsa)"       { send    "\n";  exp_continue }
            "Overwrite (y/n)?"   { send    "y\n"; exp_continue }
            "no passphrase):"    { send    "\n";  exp_continue }
            "again:"             { send    "\n";  exp_continue }
        }
    
    EOF
    }
    
    # 写个自动免密登录的函数
    send_key () {
    pwd=upsa
    /usr/bin/expect <<EOF
    set timeout 30
    
    # 发送公钥给对方服务器
    spawn ssh-copy-id root@$1
    expect {
    "yes/no" { send "yes\n"; exp_continue }
    "password:" { send "${pwd}\n"} }
    expect eof
    EOF
    }
    
    # 定义一个变量,其值是当前用户的公钥文件
    pub_key_file=$HOME/.ssh/id_rsa.pub
    
    # 假如公钥文件不存在,说明需要创建密钥对
    if [ ! -f ${pub_key_file} ];then
        auto_keygen
    fi
    
    # 循环一个存放 ip 地址的文件,并且把每个 IP地址传递给 函数
    for ip in $(cat ./ips.txt)
    do
       send_key $ip
    done
    
    keygen (){
        /usr/bin/expect<<EOF
        spawn ssh-keygen
    
            expect {
                "(/root/.ssh/id_rsa):"       { send "\n"; exp_continue }
                "Overwrite (y/n)?"           { send "y\n"; exp_continue }
                "(empty for no passphrase):" { send "\n"; exp_continue }
                "passphrase again:"          { send "\n" exp_continue }
            }
    EOF
    }
    
    copyid (){
    passwd=密码
    /usr/bin/expect<<EOF
        spawn ssh-copy-id root@$ip
        expect {
            "continue connecting (yes/no)?" {send "yes\n" exp_continue }
            "password:"                     { send "$passwd\n" exp_continue }
        }
    EOF
    }
        idfile=$HOME/.ssh/id_rsa.pub
        if [ -f $idfile ];then
            exit
        else
            keygen
        fi
    for ip in 10.3.134.{2..254}     #多主机进行交互免密登陆
    do
        copyid $ip
    done
    
    

    相关文章

      网友评论

          本文标题:十、expect 自动交互

          本文链接:https://www.haomeiwen.com/subject/zbzqactx.html