shell腳本免交互——ecpect

Expect概述shell

  • Expect是創建在tcl基礎上的一個工具,Expect是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對於大規模的Linux運維頗有幫助。
  • 在Linux運維和開發中,咱們常常須要遠程登陸服務器進行操做,登陸的過程是一個交互的過程,可能須要輸入yes/no、password等信息。爲了模擬這種輸入,可使用Expect腳本。
    Expect安裝
    yum install expect -y   安裝expect服務

    Expect基本命令
    1.send:向進程發送字符串,用於模擬用戶的輸入數組

  • 該命令不能自動回車換行,通常要加\r (回車)
    2.expect
  • expect的一個內部命令,判斷上次輸出的結果裏是否包含指定的字符串,若是有則當即返回,不然就等待超時時間後返回。
  • 只能捕捉spawn啓動的進程的輸出。
    3.spawn:啓動進程,並跟蹤後續交互信息。
    4.interact:執行完成後保持交互狀態,把控制權交給控制檯
    5.Timeout:指定超時時間,過去則繼續執行後續指令
  • 單位是:秒
  • timeout -1 爲永不超時
  • 默認狀況下,timeout是10秒
    6.exp_continue
  • 容許expect繼續向下執行
    7.send_user
  • 回顯命令,至關於echo
    8.$argv 參數數組
  • expect腳本能夠接受從bash傳遞的參數,可使用【lindex,$argv n】得到,n從0開始,分別表示第一個、第二個。。。
    9.Expect腳本必須以interact或expect eof結束,執行自動化任務一般expect eof就夠了
  • expect eof 是在等待結束標誌,由spawn啓動的命令在結束時會產生一個eof標記,expect eof就是在等待這個標記。
    Expect語法
    單一語法分支
    expect 「password」 {send 「mypassword」;}

    多分支語法結構bash

    expect {
    "aaa"{send "AAA\r"}
    "bbb"{send "BBB\r"}
    "ccc"{send "CCC\r"}
    }

    示例:
    1.利用expect 完成ssh登陸過程
    (1)直接執行服務器

    #!/usr/bin/expect
    set timeout 60
    #環境設置
    log_flie test.log
    log_user 1
    #變量定義
    set hostname [lindex $argv 0]
    set password [lindex $argv 1]
    #啓動spawn
    spawn ssh root@$hostname
    #匹配條件
    expect {
    "(yes/no)"
    {send "yes\r";exp_continue}
    "password"
    {send "$password\r"}
    }
    #權限轉交控制檯
    interact

    (2)嵌入執行運維

    #!/bin/bash
    hostname=$1
    password=$2
    /usr/bin/expect<<-EOF
    spwan ssh root@${hostname}
    expect{
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send "password\r"}
    }
    expect "*]#"
    send "exit\r"
    expect eof
    EOF

    2.建立用戶tom,密碼tom123ssh

    #!/bin/bash
    user=$1
    password=$2
    useradd=$user
    expect<<-EOF
    spawn passwd $user
    expect {
            "New password:"
            send "${password}\r"
            "Retype new password:"
            send "${password}\r"
    }
    ecpect eof
    EOF
相關文章
相關標籤/搜索