公司有五十多台伺服器。每台伺服器中使用的密碼完全不同,同時作業系統也不一樣,centos5,6,7 、ubuntu,windows都有,更不用提其中各種小版本。
root密碼定期更改是一個大問題(windows暫時不提)。
對于批量更改,首先想到的ansible,但是使用ansible有一個問題就是需要一台管理機,管理機需要通過将自己的ssh_key傳給被受體伺服器才可以正常使用
對于添加ssh_key,固然很麻煩。是以後面找到了
expect
這個指令 expect
指令預設伺服器中沒有,可以在阿裡的base源中找到,直接使用 yum install -y expect
進行安裝
直接看腳本
伺服器清單資訊
[root@bogon ~]# cat modifyrootpasswd.txt
##ip user port oldpw newpw
##------------------------------------------------------------------------------------------------------
192.168.3.145 root 22 chunlanyy PU4XdnIy3eWz7TM17OKniHoeBUnRMO1q
192.168.3.146 root 22 chunlanyy 70Zzm993Qnf13MGpBHaBgcvUX7pztwib
[root@bogon ~]#
在excel表中,按上述格式,把舊密碼寫入,然後再批量直接将要修改的新密碼複制進入
密碼批量生成使用
tr
指令
[root@bogon ~]# tr -cd '[:alnum:]' < /dev/urandom | fold -w 32 | head -2
QSnDl7EuEXLUbgNf9jBuVm8P0x6zb3OT
wvk4ihCl7G2f0ISySu2COifr1tHtAp6C
其中head可以顯示多少行,然後直接copy至excel中,自動對齊
後将整個excel表的資訊copy至sublime中,形成文本rz至伺服器中即可
要注意的是,在伺服器資訊清單中,一定要cat一下文本的内容,注意linux和windows中不同分隔符的差別。
[root@bogon ~]# cat modifyrootpasswd.txt
##ip user port oldpw newpw
192.168.3.145 root 22 chunlanyy PU4XdnIy3eWz7TM17OKniHoeBUnRMO1q
192.168.3.146 root 22 chunlanyy 70Zzm993Qnf13MGpBHaBgcvUX7pztwib[root@bogon ~]#
如果出現的像是這種,會導緻密碼修改失敗。
expect腳本
[root@bogon ~]# cat passwordmodify.sh
#!/bin/bash
File=/root/modifyrootpasswd.txt
for Ip in `awk '/^[^#]/{print $1}' $File`;do
User=`awk -v Var=$Ip '{if(Var==$1)print $2}' $File`
Port=`awk -v Var=$Ip '{if(Var==$1)print $3}' $File`
Oldpw=`awk -v Var=$Ip '{if(Var==$1)print $4}' $File`
Newpw=`awk -v Var=$Ip '{if(Var==$1)print $5}' $File`
expect -c "
spawn ssh -p $Port $User@$Ip
set timeout 30
expect {
\"(yes/no)\" {send \"yes\r\";exp_continue}
\"password:\" {send \"$Oldpw\r\";exp_continue}
\"$User@*\" {send \"echo \'$Newpw\' |passwd --stdin $User\r exit\r\";exp_continue}
}"
done
要注意的是
1.expect中的\r是出現互動的标示符
2.spawn是expect中的執行指令
小結:
相比于ansible,expect具有友善簡潔的作用,不受制于ssh_key。
但是缺點也很明顯,執行結果顯示并不直接,因為有一大堆互動内容顯示(完全模拟手動登陸),無法知曉更改結果,同時在伺服器密碼的生成也不夠自動化。