视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
远程批量修改linux服务器密码的脚本
2025-09-29 09:02:54 责编:小OO
文档
批量修改远程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.sh  path/iplist  path/adduser"

        exit

fi

cat $1 | while read line

do

       [ -z $line ] && continue

       $2   $line;

done

echo -e "\\n  well done\\n"

下面是最重要的部分 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 to continue connecting (yes/no)?" {

         send "yes\\r"

     } -re "assword:" {

         send "$loginpass\\r"

     } -re "Permission denied, please try again." {

        exit

     } -re "Connection refused" {

         exit

     } timeout {

        exit

     } eof {

        exit

     }

}

expect {

  -re "assword:" {

     send "$loginpass\\r"

  }

  -re $cmd_prompt {

     send "\\r"

  }

}

#-------------------------------------------修改密码

 send "passwd $passuser \\r";

expect {

 "New UNIX password:" {

   send "$newpass\\r"

 }

 "passwd: Only root can specify a user name." {

  exit

 }

}

expect {

 "Retype new UNIX password:" {

   send "$newpass\\r"

 }

}

#------------------------------------------------------添加一个新用户并改密码

expect -re  $cmd_prompt

sleep 1

send "useradd  $newusername \\r"

sleep 1

send "passwd $newusername \\r";

expect {

 "New UNIX password:" {

   send "$newpasswd\\r"

 }

 "passwd: Only root can specify a user name." {

  exit

 }

}

expect {

 "Retype new UNIX password:" {

   send "$newpasswd\\r"

 }

}

#---------------------------------------------退出

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.pub 192.168.9.201:/root/.ssh/authorized_keys

[root@manage .ssh]# scp id_rsa.pub 192.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 set password, default = passwd)

比如说你要指定一个长度为8,而且至少有三个大写字母的密码,那么可以这样输入:

mkpasswd -l 8 - C 3,好了,密码就会按你的要求随机产生了

 

yum -y install expect

 

ip_list.txt为远程服务器IP列表

[root@manage .ssh]# cat ip_list.txt

192.168.9.201

192.168.9.202

如果远程服务器修改了默认ssh的端口号,就使用ssh -p 17173,17173为端口号

 

#!/bin/bash

#============== Though ssh remote server ,auto modify ROOT 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\please check!\" >> 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 key pair. (以下一路回车)

    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 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:

    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]#scp id_rsa.pub 60.28.*.*:/root/.ssh/ 

    3.

    在B主机上将A的公钥更名为

    [root@buddytj-11 .ssh]#mv id_rsa.pub authorized_keys 

    4.至此从A主机远程SSH B主机的工作即告完成 

    超EASY

    ===============================================================================

    二

    ===============================================================================

    修改B主机的密码SHELL

    A#echo 'your_config_passwd' > passwd.txt (建立一个密码文件,输入你要的密码)

     #ssh 60.28.*.* passwd root --stdin 三

    ===============================================================================

    批量修改主机密码 (继续完成中!!!!!!!!!!!!!!!)

    批量SHELL小例,其中还有些不完善的地方!使用中请注意 

     

    #!/bin/bash

    ###################Though ssh 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 $IP passwd 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\\n"

     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.pub authorized_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 ,auto modify 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 $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\please check!\" >> M_pass.log

fi

done

[root@test ~]#下载本文

显示全文
专题