expect配合shell 实现自动分发秘钥文件
expect使用场景
有时候需要批量地执行一些操作,或者执行自动化的操作的时候,有些指令需要交互式地进行这就会有很多麻烦,linux下有一个程序交expect,它可以模拟键盘输入文本,省去人工干预交互式的指令
expect工作方式
首先使用 spawn 开启一个会话,然后使用 expect-send 对来执行交互式操作。
spawn 后面跟上一个命令操作,表示开启一个会话。expect 等待输出特定的字符串(通常是提示符),然后使用send 发送交互字符串。比如:
spawn ssh username@host # 远程登录
expect "*assword" # 提示为:"username@host's password:", 等待用户输入密码
send "${password}\r" # 这时使用send模拟用户输入密码的字符串,完成登录验证
安装expect
正常情况下linux默认没有安装这个软件,需要自己安装;
[root@localhost ~]# yum install expect -y
基本语法使用
expect可以写成独立的格式,脚本格式为
#!/usr/bin/expect
也可以嵌套在shell脚本中使用
set
设置会话超时时间
set timeout 5
spawn
spawn 后面跟一个shell命令,就是开启了一个会话
例如:
spwan scp f1.txt 192.168.214.111:/home
expect-send
expect接收 spwan 后面的命令执行的输出,然后和期望字符串匹配,若对应匹配则执行相应的send来发送交互信息;
expect 使用 ‘{ }’表示一组表达式,且花括号前后要留空格
例如:
expect "(yes/no)" {send "yes\n"}
# "(yes/no)" 是期望匹配的字符串
#{ send "yes\n"; exp_continue } expect 匹配到字符串后执行模拟输入的内容
expect还可以使用多字符匹配:如下
expect {
"(yes/no)" { send "yes\n"; exp_continue }
"password:" { send "$password\n" }
}
结束符
expect eof
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了
expect一般用于登录ssh服务器,除了ssh命令输入密码外,还有scp也是需要密码输入的,因此expect与scp结合起来使用的场景也是很多的。
实例:自动推送秘钥文件到远程主机
试想,如果要实现一些自动化的工作时,免密远程登录是必不可少的,假如在部署ansible前要将ansible的秘钥文件推送给100台服务器,这个时候在脚本中使用scp指令避免不了要进行交互式地应答,(使用ansible的authoried_keys模块的方式推送就另说了)这个时候就需要使用expect来进行自动应答地执行了
编写shell脚本,在脚本中调用expect来实现自动向远处主机推送秘钥:
#!/bin/bash
keypath=/root/.ssh
[ -d ${keypath} ] || mkdir -p ${keypath}
rpm -q expect &> /dev/null || yum install expect -y
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ""
password=123456
while read ip;do
expect <<EOF
set timeout 5
spawn ssh-copy-id $ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect eof
EOF
done < /home/ip.txt
执行结果:要分发秘钥的主机会自动生成秘钥文件并将秘钥文件推送给ip.txt文件列表中的主机
[root@Ansible script]# ./autokey.sh
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
96:4d:4b:be:be:54:d8:54:98:4c:24:be:6d:ef:6d:53 root@Ansible
The key's randomart image is:
+--[ RSA 2048]----+
| .+oo. |
| . .+. |
| + . |
| * B |
| S * = |
| . + . E|
| o . .|
| o . o.|
| o. ..o|
+-----------------+
spawn ssh-copy-id 192.168.214.128
The authenticity of host '192.168.214.128 (192.168.214.128)' can't be established.
RSA key fingerprint is af:6f:6a:b1:40:b9:ab:c2:05:a4:04:3e:0d:df:1a:e0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.214.128' (RSA) to the list of known hosts.
root@192.168.214.128's password:
Now try logging into the machine, with "ssh '192.168.214.128'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
spawn ssh-copy-id
Usage: /usr/bin/ssh-copy-id [-i [identity_file]] [user@]machine
expect: spawn id exp4 not open
while executing
"expect eof"
测试一下:
[root@Ansible script]# ssh 192.168.214.128 'hostname'
localhost.localdomain
expect配合shell 实现自动分发秘钥文件的更多相关文章
- ssh分发秘钥时出现错误“Permission denied (publickey,gssapi-keyex,gssapi-with-mic)”
因为公司的服务器连接是通过xshell公钥和密码连接的,今天在ssh分发秘钥的时候出现了,下面的错误: [root@iZ2ze97cumk8opqm28h8Z .ssh]# ssh-copy-id - ...
- 关于git中Pageant开机启动且自动关联秘钥
Pageant在git中主要负责和服务器端进行身份验证,但是我们每次在启动Pageant后都需要手动的加载秘钥文件,这其实是一个比较烦的过程,我们怎么能够使其自动的完成呢? 一.Pageant开机启动 ...
- sshd 指定端口,指定秘钥文件
scp -i ~/test -P22219 SRC/ root@10.2.227.76:/data/ #sshd的端口指定的是22219, -i 指定秘钥文件 指定秘钥文件需要注意的是,需要提 ...
- 生成秘钥文件 sn.exe(Strong Name Tool)
Visual Studio 内置 Strong Name Tool, 我们直接运行"VS开发人员命令提示"就可以生成秘钥文件. 秘钥文件包含公钥和私钥. 来看这个例子: 在文件夹下 ...
- 使用CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件
要安装kubernetes最新版集群,https://github.com/opsnull/follow-me-install-kubernetes-cluster 这个文档必须要研习一下了. 以下实 ...
- JAVA中使用RSA通过秘钥文件对字符串进行加密解密
技术交流群: 233513714 //字符串进行加密算法的名称 public static final String ALGORITHM = "RSA"; //字符串进行加密填充的 ...
- SFTP协议生成公共秘钥文件
[步骤] 1 ssh方式登录服务器 2 执行命令生成秘钥对 ssh-keygen -t rsa 然后给秘钥文件命名 3.查看当前目录的.ssh目录是否有authorized_keys文件 如果有则把新 ...
- k8s的一键分发秘钥 需要yum install expect
#下面的密码你改改就行了 我的机器也用的123456 ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa for i in k8s-1 k8s ...
- ssh使用秘钥文件连接提示WARNING: UNPROTECTED PRIVATE KEY FILE!(转载)
转自:http://www.01happy.com/ssh-unprotected-private-key-file/ 在centos 6.4下使用ssh连接远程主机时,用的是另外一个密钥,需要用-i ...
随机推荐
- 用Windows Live Writer离线写博客
作为CSDN博客的菜鸟,我发现在线写博客很不方便,而且文字编辑也不方便,比如不能傻瓜化地修改字体和颜色."有志者自有千方百计,无志者只感千难万难."一番搜索后,我发现了Window ...
- 利用nginx的fastcgi_cache模块来做缓存
nginx不仅有个大家很熟悉的缓存代理后端内容的proxy_cache,还有个被很多人忽视的fastcgi_cache. proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的 ...
- 语文,数学,ps
数学教2课以集合为主. 集合:是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素. 特点:确定性给定一个集合,哪些对象是这个集合元素,不允有模棱两可的情况.互用性任何两个元 ...
- SpingCloud微服务架构学习(一)之服务提供者与服务消费者
微服务构建的是分布式系统,各个微服务之间通过网络进行服务调用,这就有了服务提供者(被调用方)和服务消费者(调用方),以电影售票系统为例,假设服务调用关系如下图所示: 围绕此场景,我们先编写一个用户微服 ...
- Http和Https的区别--笔记
学习链接: 知乎:https://www.zhihu.com/question/19577317 法号桑菜 http://blog.csdn.net/jasonjwl/article/details/ ...
- 从刷票了解如何获得客户端IP
我的个人博客,源地址:http://www.woniubi.cn/get_client_ip/ 前两个星期帮一个朋友的亲戚的孩子刷票,谁让咱们是程序员呢.这当中也遇到过重装系统,除灰尘,淘宝购物,盗Q ...
- Struts2_BBS2009小实战
Struts2_BBS2009准备:链接: http://pan.baidu.com/s/1nvTZz9R 密码: 875a ext3.0_直接部署运行:链接: http://pan.baidu.co ...
- git 获取领先落后的命令
git --git-dir=/data/usr/local/gerrit-site/git/aixuexi-admin.git rev-list --left-right --count master ...
- vsftpd配置
yum -y install vsftpd useradd upload -s /sbin/nologin passwd upload mkdir /data/upload chown -R upol ...
- 非常全面的PHP header函数设置HTTP头的示例
突然看到这个,觉得很好,就拿过来了,如下: //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Conten ...