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/functions for 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 fi done
此腳本的名字fenfa-sshkey.sh 這個腳本也很簡單,意思就是引入上面的exp腳本,然後輸入三個變量, 本地的公鑰位置,IP ,遠程目錄的公鑰位置。
第五步,測試效果。
把私鑰copy過來,把公鑰也改回來名字,單機測試了一下SSH可以連,不用密碼。
如果需要批量操作,就需要引用其他的腳本來實現了。例如批量取IP,批量分發hosts文件,批量安裝軟件等等。