shell_expect实现自动交互免密登录操作

expect实现自动交互免密登录操作

expect 内部命令

spawn   shell 命令程序 

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

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

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

在脚本中使用

# 写个用于自动生成密钥对的函数
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 () {
/usr/bin/expect <<EOF
set timeout 30

# 继续发送第二条命令
spawn ssh-copy-id root@$1
expect {
"yes/no" { send "yes\n"; exp_continue }
"password:" { send "upsa\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

注意上面程序中的空格和大括号的间隔 错一个就可能会出错

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容