expect是一个很好用的工具,他的亮点就是可以简化会话的交互式操作,实现自动分发公钥的功能,不要自己每一个都去输入密码或者IP了。这样大大节约了运维工作的效率。
分发好的效果图。
因为我们在第一次给我们的服务器分发公钥的时候,每一个都需要确认输入yes然后输入密码。这些工作本来是需要我们手动去输入的,这就是交互式会话。
但是那么多服务器,几百几千台,我们每一个都去重复性的去输入吗?那太麻烦了。所有就有了expect可以自动输入。
大概四个要领。
第一步,安装软件,
yum install expect -y
直接yum就安装了,很方便。
然后批量新建用户,本来批量新建用户,这里我们就直接在CRT里直接批量新建了。
useradd oldgirl
echo 123456|passwd --stdin oldgirl
su - oldgirl
第二步,我们要备份自己的公钥,然后把本机的私钥移走到另外的目录。因为私钥是不能给被人的,只要公钥才能给别人。然后把公钥备份一下,并把公钥copy一份命名为authorized_keys。
只能命名为这个,这个就相当于是手动的运行ssh-copy-id 这个命令,懂的都懂。
第三步,设置自动分发的exp的脚本,
#! /usr/bin/expect #这里的意思是要输入3个参数,如果不输入三个参数就会输出一句话if { $argc !=3 } { send_user "usage: expect fenfauser-simple.exp file host dir\n" exit }#define var 定义了三个变量set file [lindex $argv 0] set host [lindex $argv 1] set dir [lindex $argv 2] set password "123456"spawn scp -P22 -r -p $file oldgirl@$host:$dir#可能出现的对话框,然后send输入 expect { "yes/no" {send "yes\r";exp_continue} "*password" {send "$password\r"} } expect eof exit
相信这么简单的代码,稍微有一点编程基础的都可以看懂吧!此脚本的名字
fenfauser-simple.exp
顺便插入一个使用expect自动登入SSH的代码。也很简单。
#! /usr/bin/expect set host "192.168.3.106"set passwd "123456"spawn ssh oldgirl@$host expect {"yes/no" { send "yes\r"; exp_continue}"password:" { send "$passwd\r" } } expect eof exit
第四步编写shell脚本,
#!/bin/sh. /etc/init.d/functionsfor ip in `cat iplist`do expect fenfauser-simple.exp /home/oldgirl/.ssh $ip /home/oldgirl >/dev/null 2> &1 if [ $? -eq 0 ] ;then action "$ip" /bin/true else action "$ip" /bin/false fidone
此脚本的名字fenfa-sshkey.sh 这个脚本也很简单,意思就是引入上面的exp脚本,然后输入三个变量, 本地的公钥位置,IP ,远程目录的公钥位置。
第五步,测试效果。
把私钥copy过来,把公钥也改回来名字,单机测试了一下SSH可以连,不用密码。
如果需要批量操作,就需要引用其他的脚本来实现了。例如批量取IP,批量分发hosts文件,批量安装软件等等。