公司現在有100多臺服務器,需要對服務器進行批量的修改root密碼,還要在每臺服務器新建一個用戶,如果一個一個登到的服務器上進行修改的話,估計一個下午又沒有了,首先想到的是我最喜歡的php,其中有個ssh2 模塊,不得不承認用php 來處理這樣的任務是一件很糾結的事情,然后又想到了用shell,不過發現很快就寫不下去了,shell 的交互能力還是不能讓人恭維的,最后發現了expect,expect 以其強大的交互能力,無疑是處理這類任務的首選,再加上expect 可以內嵌shell,這使得他變得更強大。
第一種方法通過expect批量修改linux服務器用戶名和密碼
首先要有一個服務器的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.sh path/iplist path/adduser"
exit
fi
cat $1 | while readline
do
[ -z $line ] && continue
$2 $line;
done
echo -e"
well done
"
下面是最重要的部分 adduser
#!/usr/bin/expect
#登錄的用戶名
set loginuser""
#密碼
set loginpass ""
#要修改的用戶名
set passuser"dfdjfk"
#要修改成的新密碼
set newpass"your new password"
#要添加的新的用戶名
set newusername"newusername"
#要添加的新用戶的密碼
set newpasswd "newpasswd"
set ipaddr [lrange$argv 0 0]
set timeout 300
set cmd_prompt"]#|~]?"
#—————————————————通過ssh 登錄
spawn ssh$loginuser@$ipaddr
set timeout 300
expect {
-re "Are you sure you want tocontinue connecting (yes/no)?" {
send "yes
"
} -re "assword:" {
send "$loginpass
"
} -re "Permission denied, please tryagain." {
exit
} -re "Connection refused" {
exit
} timeout {
exit
} eof {
exit
}
}
expect {
-re "assword:" {
send "$loginpass
"
}
-re $cmd_prompt {
send "
"
}
}
#——————————————-修改密碼
send "passwd $passuser
";
expect {
"New UNIX password:" {
send "$newpass
"
}
"passwd: Only root can specify a username." {
exit
}
}
expect {
"Retype new UNIX password:" {
send "$newpass
"
}
}
#——————————————————添加一個新用戶并改密碼
expect -re $cmd_prompt
sleep 1
send"useradd $newusername
"
sleep 1
send "passwd$newusername
";
expect {
"New UNIX password:" {
send "$newpasswd
"
}
"passwd: Only root can specify a username." {
exit
}
}
expect {
"Retype new UNIX password:" {
send "$newpasswd
"
}
}
#———————————————退出
expect -re$cmd_prompt
exit
ok 調試完也將近花費了一個下午
第二種方法通過shell腳本實現批量更改密碼
#!/bin/bash
# BY kerryhu
# MAIL:king_819@163.com
# BLOG:http://kerry.blog.51cto.com
# Please manual operation yum of before Operation…..
一、建立信任關系
192.168.9.203 為管理機
192.168.9.201 192.168.9.202 為遠程linux服務器
1、在管理機生成證書、
[root@manage ~]# ssh-keygen -t rsa (然后一路回車)
Generating public/private rsa key pair.
Enter file in which to save the key(/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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:
36:ec:fc:db:b0:7f:81:7e:d0:1d:36:5e:29:dd:5b:a0
2、將管理機上的公鑰傳送到各遠程服務器
如遠程服務器更改了默認的ssh端口號,就使用scp -P 17173,17173為端口號
[root@manage .ssh]# scp id_rsa.pub192.168.9.201:/root/.ssh/authorized_keys
[root@manage .ssh]# scp id_rsa.pub192.168.9.202:/root/.ssh/authorized_keys
管理機與遠程主機信任關系建立完畢
注意:可能會出現并未建立信任關系的情況。還需操作一下步驟
在GNOME下設置ssh-agent
如果你在GNOME運行環境下,執行以下幾步配置ssh-agent.ssh-agent工具用戶保存你的DSA密鑰passphrase以便每次ssh或者scp到Machine B的時候. 當你登陸GNOME,openssh-askpass-gnome提示輸入passphrase并保存, 直到你退出GNOME. 在該GNOMEsession中,當ssh或者scp連接到Machine B時,系統將不再要求你輸入passphrase.
在GNOME session中保存passphrase操作步驟:
1.選擇Main Menu Button(在Panel上) => Preferences => MorePreferences=> Sessions, 點擊 Startup Programs 標簽. 點擊 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]
where arguments are:
-l # (length of password, default = 10)
-d # (min # of digits, default = 2)
-c # (min # of lowercase chars, default = 2)
-C # (min # of uppercase chars, default = 2)
-s # (min # of special chars, default = 1)
-v (verbose, show passwd interaction)
-p prog (program to setpassword, default = passwd)
比如說你要指定一個長度為8,而且至少有三個大寫字母的密碼,那么可以這樣輸入:
mkpasswd -l 8 – C 3,好了,密碼就會按你的要求隨機產生了
yum -y install expect
ip_list.txt為遠程服務器IP列表
[root@manage .ssh]# catip_list.txt
192.168.9.201
192.168.9.202
如果遠程服務器修改了默認ssh的端口號,就使用ssh -p 17173,17173為端口號
#!/bin/bash
#============== Though ssh remote server ,auto modifyROOT passwd =============#
for IP in `cat /root/ip_list.txt` #導入遠程要修改主機的IP
do
#========================= 創建遠程主機密碼 ==========================#
TMP_PWD=`mkpasswd -l 8 -C 3` 紅色字體可以寫成自己需要的密碼
R_PWD=`echo ${IP}_${TMP_PWD}` 紅色字體可以寫成自己需要的密碼
echo "${IP}_${TMP_PWD}"> R_PWD.txt 紅色字體可以寫成自己需要的密碼
#=========================== 修改遠程主機密碼 ========================#
if [ $? = 0 ] ; then
ssh $IP passwd root –stdin <R_PWD.txt
echo -e "$(date "+%Y-%m-%d%H:%M:%S") ${IP} ${R_PWD} " >> R_Server.log
else
echo -e "$(date "+%Y-%m-%d%H:%M:%S") ${IP} R_PWD.txt is create fail please check! " >>M_pass.log
fi
if [ $? = 0 ] ; then
echo -e "$(date "+%Y-%m-%d%H:%M:%S") The ${IP} passwd is modify OK " >> M_pass.log
else
echo -e "$(date "+%Y-%m-%d%H:%M:%S") The ${IP} passwd is modify fail pleasecheck! " >> M_pass.log
fi
done
第二種方法的另一個實例
建立SSH信任
將A主機做為客戶端(發起SSH請求)
將B主機作為服務器端(接收ssh請求)
以上以主動發起SSH登錄請求的主機和接收請求的主機進行分類
1.
A主機生成公,私鑰證書
[root@buddytj-10 .ssh]# ssh-keygen -t rsa#rsa算法的證書
Generating public/private rsa keypair. (以下一路回車)
Enter file in which to save the key(/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y (因為我的證書已經存在,覆蓋即可)
Enter passphrase (empty for nopassphrase):
Enter same passphrase again:
Your identification has been savedin /root/.ssh/id_rsa. (私鑰)
Your public key has been saved in/root/.ssh/id_rsa.pub. (公鑰)
The key fingerprint is:
c1:26:cc:88:2b:05:dd:c3:6b:1e:78:5d:da:9c:da:8a
證書就生成了。id_rsa (私鑰)|| id_rsa.pub (公鑰)
2.
將A主機生成的公鑰傳遞給B主機
[root@buddytj-10 .ssh]#scp id_rsa.pub60.28.*.*:/root/.ssh/
3.
在B主機上將A的公鑰更名為
[root@buddytj-11 .ssh]#mv id_rsa.pubauthorized_keys
4.至此從A主機遠程SSH B主機的工作即告完成
超EASY
===============================================================================
二
===============================================================================
修改B主機的密碼SHELL
A#echo 'your_config_passwd' >passwd.txt(建立一個密碼文件,輸入你要的密碼)
#ssh 60.28.*.* passwd root –stdin 三
===============================================================================
批量修改主機密碼 (繼續完成中!!!!!!!!!!!!!!!)
批量SHELL小例,其中還有些不完善的地方!使用中請注意
#!/bin/bash
###################Thoughssh remote server ,auto modify ROOT passwd###########
for IP in`cat /root/ip_list.txt` #####導入遠程要修改主機的IP#################
do
##############獲得遠程主機的用戶名###############################################
##############這個程序是通過獲得遠程主機名,利用這個名字為每一臺設備添加自己的專用密碼###
##############如果密碼均一致,不用效仿#############################################
R_HOSTNAME=`ssh$IP cat /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 $IPpasswd root –stdin
if [ $? =0 ] ; then
echo"The $R_HOSTNAME ($IP) passwd is modify OK"
else
echo -e"The $R_HOSTNAME ($IP) passwd is modify fail
"
echo"please you check"
fi
done
試驗成功的腳本
1,建立信任關系
建立主機A、B、C上同一用戶之間的SSH相互信任關系:
1,在主機A用戶hcwang(e.g.)上生成密鑰對。
$ ssh-keygen -t rsa
2,進入.ssh目錄
$ mv id_rsa.pub authorized_keys // (更改為系統默認的公鑰文件名)
3,將公鑰id_rsa.pub,傳輸到主機目標主機B,C
$ scp id_rsa.pub B:$HOME/.ssh
$ cat id_rsa.pub >> authorized_keys //如果沒有authorized_keys,則執行 mv id_rsa.pubauthorized_keys
同樣對主機C
$ scp id_rsa.pub C:$HOME/.ssh
$ cat id_rsa.pub >> authorized_keys
到此,可以從主機A直接 SSH 到主機B,C,無需密碼。如果想從主機B或者C,SSH 到主機A,或者主機BC之間互相SSH,則需要密碼。解決辦法如下:
4,將主機A的私鑰,id_rsa拷到 主機B和C的 $HOME/.ssh 目錄下
$ scp id_rsa B:$HOME/.ssh
$ scp id_rsa C:$HOME/.ssh
~OK
2,創建IP列表(需要修改賬號密碼的IP地址)
[root@test~]# cat ip_list.txt
192.168.10.126
192.168.10.127
192.168.10.128
3,編寫SHELL腳本
[root@test ~]# cat 1ch.sh
#!/bin/bash
#============== Though ssh remote server ,automodify ROOT passwd =============#
for IP in `cat /root/iplist`
do
#========================= mkpasswd==========================#
#TMP_PWD=`jiguang`
R_PWD=`echo "jiguang"`
echo "jiguang" > R_PWD.txt
#=========================== CHPASSWD========================#
if [ $? = 0 ] ; then
ssh $IPpasswd root –stdin < R_PWD.txt
echo -e"$(date "+%Y-%m-%d %H:%M:%S") ${IP} ${R_PWD} " >>R_Server.log
else
echo -e"$(date "+%Y-%m-%d %H:%M:%S") ${IP} R_PWD.txt is createfail please check! " >> M_pass.log
fi
if [ $? = 0 ] ; then
echo -e"$(date "+%Y-%m-%d %H:%M:%S") The ${IP} passwd is modifyOK " >> M_pass.log
else
echo -e "$(date"+%Y-%m-%d %H:%M:%S") The ${IP} passwd is modify fail pleasecheck! " >> M_pass.log
fi
done
[root@test ~]#