远程批量修改linux服务器密码的脚本.docx
《远程批量修改linux服务器密码的脚本.docx》由会员分享,可在线阅读,更多相关《远程批量修改linux服务器密码的脚本.docx(14页珍藏版)》请在冰豆网上搜索。
远程批量修改linux服务器密码的脚本
批量修改远程linux服务器密码
第一种方法通过expect批量修改linux服务器用户名和密码
公司现在有100多台服务器,需要对服务器进行批量的修改root密码,还要在每台服务器新建一个用户,如果一个一个登到的服务器上进行修改的话,估计一个下午又没有了,首先想到的是我最喜欢的php,其中有个ssh2模块,不得不承认用php来处理这样的任务是一件很纠结的事情,然后又想到了用shell,不过发现很快就写不下去了,shell的交互能力还是不能让人恭维的,最后发现了expect,expect以其强大的交互能力,无疑是处理这类任务的首选,再加上expect可以内嵌shell,这使得他变得更强大。
首先要有一个服务器的ip列表,把要处理的ip放在里面
192.168.6.236
192.168.6.235
192.168.6.234
192.168.6.233
192.168.6.232
192.168.6.231
.....
然后是shell脚本shell.sh
#!
/bin/bash
if["$1"=""]||["$2"=""]||["$1"="--help"]["$1"="-h"]
then
echo"usage:
shell.shpath/iplistpath/adduser"
exit
fi
cat$1|whilereadline
do
[-z$line]&&continue
$2$line;
done
echo-e"\nwelldone\n"
下面是最重要的部分adduser
#!
/usr/bin/expect
#登录的用户名
setloginuser""
#密码
setloginpass""
#要修改的用户名
setpassuser"dfdjfk"
#要修改成的新密码
setnewpass"yournewpassword"
#要添加的新的用户名
setnewusername"newusername"
#要添加的新用户的密码
setnewpasswd"newpasswd"
setipaddr[lrange$argv00]
settimeout300
setcmd_prompt"]#|~]?
"
#---------------------------------------------------通过ssh登录
spawnssh$loginuser@$ipaddr
settimeout300
expect{
-re"Areyousureyouwanttocontinueconnecting(yes/no)?
"{
send"yes\r"
}-re"assword:
"{
send"$loginpass\r"
}-re"Permissiondenied,pleasetryagain."{
exit
}-re"Connectionrefused"{
exit
}timeout{
exit
}eof{
exit
}
}
expect{
-re"assword:
"{
send"$loginpass\r"
}
-re$cmd_prompt{
send"\r"
}
}
#-------------------------------------------修改密码
send"passwd$passuser\r";
expect{
"NewUNIXpassword:
"{
send"$newpass\r"
}
"passwd:
Onlyrootcanspecifyausername."{
exit
}
}
expect{
"RetypenewUNIXpassword:
"{
send"$newpass\r"
}
}
#------------------------------------------------------添加一个新用户并改密码
expect-re$cmd_prompt
sleep1
send"useradd$newusername\r"
sleep1
send"passwd$newusername\r";
expect{
"NewUNIXpassword:
"{
send"$newpasswd\r"
}
"passwd:
Onlyrootcanspecifyausername."{
exit
}
}
expect{
"RetypenewUNIXpassword:
"{
send"$newpasswd\r"
}
}
#---------------------------------------------退出
expect-re$cmd_prompt
exit
ok调试完也将近花费了一个下午
第二种方法通过shell脚本实现批量更改密码
#!
/bin/bash
#BYkerryhu
#MAIL:
king_819@
#BLOG:
#PleasemanualoperationyumofbeforeOperation.....
一、建立信任关系
192.168.9.203为管理机
192.168.9.201 192.168.9.202为远程linux服务器
1、在管理机生成证书、
[root@manage~]#ssh-keygen-trsa(然后一路回车)
Generatingpublic/privatersakeypair.
Enterfileinwhichtosavethekey(/root/.ssh/id_rsa):
Enterpassphrase(emptyfornopassphrase):
Entersamepassphraseagain:
Youridentificationhasbeensavedin/root/.ssh/id_rsa. (私钥)
Yourpublickeyhasbeensavedin/root/.ssh/id_rsa.pub. (公钥)
Thekeyfingerprintis:
36:
ec:
fc:
db:
b0:
7f:
81:
7e:
d0:
1d:
36:
5e:
29:
dd:
5b:
a0
2、将管理机上的公钥传送到各远程服务器
如远程服务器更改了默认的ssh端口号,就使用scp-P17173,17173为端口号
[root@manage.ssh]#scpid_rsa.pub192.168.9.201:
/root/.ssh/authorized_keys
[root@manage.ssh]#scpid_rsa.pub192.168.9.202:
/root/.ssh/authorized_keys
管理机与远程主机信任关系建立完毕
注意:
可能会出现并未建立信任关系的情况。
还需操作一下步骤
在GNOME下设置ssh-agent
如果你在GNOME运行环境下,执行以下几步配置ssh-agent.ssh-agent工具用户保存你的DSA密钥passphrase以便每次ssh或者scp到MachineB的时候.当你登陆GNOME,openssh-askpass-gnome提示输入passphrase并保存,直到你退出GNOME.在该GNOMEsession中,当ssh或者scp连接到MachineB时,系统将不再要求你输入passphrase.
在GNOMEsession中保存passphrase操作步骤:
1.选择MainMenuButton(在Panel上)=>Preferences=>MorePreferences=>Sessions,点击StartupPrograms标签.点击Add并且在StartupCommand文本框中输入/usr/bin/ssh-add.设定一个低于任何一个已经存在的命令的优先级数字,以保证它最后被执行.一个好的ssh-add优先级数字为70或者70以上.优先级数字越大,优先级别越低.如果有其他的程序,这个程序(ssh-add)应该是最低的优先级.点击Close退出.
2.重新登陆GNOME,也就是重启X.GNOME起动后,出现一个对话框要求你输入passphrase(s).如果你已经配置了DSA和RSA密钥对,系统将提示你都输入.以后,使用ssh,scp,或者sftp都不再要求你输入密码了.
非X环境下配置ssh-agent
如果没有运行X,则按照以下步骤配置ssh-agent.如果GNOME在运行但是你不想在你登陆的时候提示输入passphrase,以下过程将在终端窗口,例如XTerm上操作.如果你运行的X不是GNOME,以下操作将在终端窗口上操作.然而,你的passphrase仅被该终端窗口记住,而不是全局设定
1.在shell提示符下输入以下命令:
exec/usr/bin/ssh-agent$SHELL
2.输入命令:
ssh-add
输入你的passphrase(s).如果你已经配置多对密钥,系统将提示你挨个输入.
3.退出系统后,passphrase(s)将会被释放.当从虚拟控制台或者终端窗口登陆时,每次都必须执行这两条命令.
二、通过shell脚本批量修改远程服务器密码
如果要调用mkpasswd就得安装expect,使用mkpasswd可以随机产生密码
usage:
mkpasswd[args][user]
whereargumentsare:
-l# (lengthofpassword,default=10)
-d# (min#ofdigits,default=2)
-c# (min#oflowercasechars,default=2)
-C# (min#ofuppercasechars,default=2)
-s# (min#ofspecialchars,default=1)
-v (verbose,showpasswdinteraction)
-pprog (programtosetpassword,default=passwd)
比如说你要指定一个长度为8,而且至少有三个大写字母的密码,那么可以这样输入:
mkpasswd-l8-C3,好了,密码就会按你的要求随机产生了
yum-yinstallexpect
ip_list.txt为远程服务器IP列表
[root@manage.ssh]#catip_list.txt
192.168.9.201
192.168.9.202
如果远程服务器修改了默认ssh的端口号,就使用ssh-p17173,17173为端口号
#!
/bin/bash
#==============Thoughsshremoteserver,automodifyROOTpasswd=============#
forIPin`cat/root/ip_list.txt`#导入远程要修改主机的IP
do
#=========================创建远程主机密码==========================#
TMP_PWD=`mkpasswd-l8-C3`红色字体可以写成自己需要的密码
R_PWD=`echo${IP}_${TMP_PWD}`红色字体可以写成自己需要的密码
echo"${IP}_${TMP_PWD}">R_PWD.txt红色字体可以写成自己需要的密码
#===========================修改远程主机密码========================#
if[$?
=0];then
ssh$IPpasswdroot--stdin echo-e"$(date"+%Y-%m-%d%H:
%M:
%S")\t${IP}\t${R_PWD}\t">>R_Server.log
else
echo-e"$(date"+%Y-%m-%d%H:
%M:
%S")\t${IP}R_PWD.txtiscreatefail\tpleasecheck!
\t">>M_pass.log
fi
if[$?
=0];then
echo-e"$(date"+%Y-%m-%d%H:
%M:
%S")\tThe${IP}passwdismodifyOK\t" >>M_pass.log
else
echo-e"$(date"+%Y-%m-%d%H:
%M:
%S")\tThe${IP}passwdismodifyfail\tpleasecheck!
\t" >>M_pass.log
fi
done
第二种方法的另一个实例
建立SSH信任
将A主机做为客户端(发起SSH请求)
将B主机作为服务器端(接收ssh请求)
以上以主动发起SSH登录请求的主机和接收请求的主机进行分类
1.
A主机生成公,私钥证书
[root@buddytj-10.ssh]#ssh-keygen-trsa#rsa算法的证书
Generatingpublic/privatersakeypair.(以下一路回车)
Enterfileinwhichtosavethekey(/root/.ssh/id_rsa):
/root/.ssh/id_rsaalreadyexists.
Overwrite(y/n)?
y(因为我的证书已经存在,覆盖即可)
Enterpassphrase(emptyfornopassphrase):
Entersamepassphraseagain:
Youridentificationhasbeensavedin/root/.ssh/id_rsa.(私钥)
Yourpublickeyhasbeensavedin/root/.ssh/id_rsa.pub.(公钥)
Thekeyfingerprintis:
c1:
26:
cc:
88:
2b:
05:
dd:
c3:
6b:
1e:
78:
5d:
da:
9c:
da:
8a
[email=root@buddytj-10]root@buddytj-10[/email]
证书就生成了。
id_rsa(私钥)||id_rsa.pub(公钥)
2.
将A主机生成的公钥传递给B主机
[root@buddytj-10.ssh]#scpid_rsa.pub60.28.*.*:
/root/.ssh/
3.
在B主机上将A的公钥更名为
[root@buddytj-11.ssh]#mvid_rsa.pubauthorized_keys
4.至此从A主机远程SSHB主机的工作即告完成
超EASY
===============================================================================
二
===============================================================================
修改B主机的密码SHELL
A#echo'your_config_passwd'>passwd.txt(建立一个密码文件,输入你要的密码)
#ssh60.28.*.*passwdroot--stdin三
===============================================================================
批量修改主机密码(继续完成中!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
)
批量SHELL小例,其中还有些不完善的地方!
使用中请注意
#!
/bin/bash
###################Thoughsshremoteserver,automodifyROOTpasswd###########
forIPin`cat/root/ip_list.txt`#####导入远程要修改主机的IP#################
do
##############获得远程主机的用户名###############################################
##############这个程序是通过获得远程主机名,利用这个名字为每一台设备添加自己的专用密码###
##############如果密码均一致,不用效仿#############################################
R_HOSTNAME=`ssh$IPcat/etc/sysconfig/network|awk-F='/HOSTNAME/{print$2}'`
#echo$R_HOSTNAME
#################创建远程主机密码################################################
CREATE_PWD=`echo$R_HOSTNAME|awk-F-'{print$2}'|tr'[a-z]''[A-Z]'`
echo"${CREATE_PWD}123">passwd.tmp
###################修改远程主机密码##############################################
if[$?
=0];then
ssh$IPpasswdroot--stdin
if[$?
=0];then
echo"The$R_HOSTNAME($IP)passwdismodifyOK"
else
echo-e"The$R_HOSTNAME($IP)passwdismodifyfail\n"
echo"pleaseyoucheck"
fi
done
试验成功的脚本
1,建立信任关系
建立主机A、B、C上同一用户之间的SSH相互信任关系:
1,在主机A用户hcwang(e.g.)上生成密钥对。
$ssh-keygen-trsa
2,进入.ssh目录
$mvid_rsa.pubauthorized_keys //(更改为系统默认的公钥文件名)
3,将公钥id_rsa.pub,传输到主机目标主机B,C
$scpid_rsa.pubB:
$HOME/.ssh
$catid_rsa.pub>>authorized_keys//如果没有authorized_keys,则执行mvid_rsa.pubauthorized_keys
同样对主机C
$scpid_rsa.pubC:
$HOME/.ssh
$catid_rsa.pub>>authorized_keys
到此,可以从主机A直接SSH到主机B,C,无需密码。
如果想从主机B或者C,SSH到主机A,或者主机BC之间互相SSH,则需要密码。
解决办法如下:
4,将主机A的私钥,id_rsa拷到主机B和C的$HOME/.ssh目录下
$scpid_rsaB:
$HOME/.ssh
$scpid_rsaC:
$HOME/.ssh
~OK
2,创建IP列表(需要修改账号密码的IP地址)
[root@test~]#catip_list.txt
192.168.10.126
192.168.10.127
192.168.10.128
3,编写SHELL脚本
[root@test~]#cat1ch.sh
#!
/bin/bash
#==============Thoughsshremoteserver,automodifyROOTpasswd=============#
forIPin`cat/root/iplist`
do
#=========================mkpasswd==========================#
#TMP_PWD=`jiguang`
R_PWD=`echo"jiguang"`
echo"jiguang">R_PWD.txt
#===========================CHPASSWD========================#
if[$?
=0];then
ssh$IPpasswdroot--stdinecho-e"$(date"+%Y-%m-%d%H:
%M:
%S")\t${IP}\t${R_PWD}\t">>R_Server.log
else
echo-e"$(date"+%Y-%m-%d%H:
%M:
%S")\t${IP}R_PWD.txtiscreatefail\tpleasecheck!
\t">>M_pass.log
fi
if[$?
=0];then
echo-e"$(date"+%Y-%m-%d%H:
%M:
%S")\tThe${IP}passwdismodifyOK\t">>M_pass.log
else
echo-e"$(date"+%Y-%m-%d%H:
%M:
%S")\tThe${IP}p