Shell脚本自动输入

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
    display "${v2v_local_cmd}"
    if [[ "x${password_file}" != "x" && "x${mode}" == "xESXi" ]]; 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