shell自動化輸入

ignorantshr發表於2019-04-26

shell自動化輸入的三種方式:

  • 重定向
  • 管道
  • expect

前兩種的前提是指令需要有引數來指定密碼輸入方式,具體使用可參考部落格:

https://blog.csdn.net/zhangjikuan/article/details/51105166

下面講一下expect方式的使用

當不想要手動輸入時(如:密碼),可使用expect來實現指令碼自動輸入。

安裝:

yum install expect -y

在shell指令碼內使用:

if [[ "x${use_v2v_local_cmd}" == "xtrue" ]]; then
    if [[ "x${password_file}" != "x" ]]; then
        passwd=`cat ${password_file}`
        expect <<-EOF
        set timeout -1

        spawn ${v2v_local_cmd}
        expect {
            "*password*" {
                send "${passwd}\r"
                exp_continue
            }
            "*error*" {
                exit 1
            }
        }
EOF
    else
        eval ${v2v_local_cmd}
    fi
fi

這種方式雖好,但是在實際使用中發現了一個限制

​ 傳入的命令不能帶有引號,否則執行失敗。比如:spawn virsh -c 'esx://root@172.16.2.179?no_verify=1' list --all,會報錯:no such file or directory。實際工作中免不了要將一些帶有特殊字元的引數用引號包起來,這時可以繞一下,將命令寫到檔案中再執行:

expect執行指令碼:pass.sh

#!/bin/expect
set command [lindex $argv 0]
set passwd [lindex $argv 1]
spawn ${command}
expect {
    "*password*" {
        send "${passwd}\r"
        exp_continue
    }
    "*error*" {
        exit 1
    }
    eof {
        exit
    }
}

儲存命令的可執行指令碼:commond.sh

#!/bin/bash
virsh -c 'esx://root@172.16.2.179?no_verify=1' list --all

然後就可以執行:

./pass.sh ./commond.sh ABCDabcd.1234

此時就達到了自動化輸入的目的。

詳細的expect使用參考部落格:https://www.cnblogs.com/lixigang/articles/4849527.html

相關文章