美文网首页
shell_expect实现自动

shell_expect实现自动

作者: 凤凤思密达萌萌哒 | 来源:发表于2019-12-28 12:00 被阅读0次

一、expect内部命令

语法结构

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

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

[root@localhost ~]# expect
expect1.1> spawn echo "hello"  #发送一条shell命令
spawn echo hello
57431
expect1.2> expect "hello"     #捕获这个字符串
hello
expect1.3> send "yes\n"      #发送一个字符串
expect1.4> expect off       # 结束这次捕获
yes

在脚本中使用

# 开始 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

实战案例

# 写个用于自动生成密钥对的函数
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

相关文章

网友评论

      本文标题:shell_expect实现自动

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