批量修改远程linux服务器密码

  公司现在有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

  root@buddytj-10

  证书就生成了。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 ~]#

 

发表评论

邮箱地址不会被公开。 必填项已用*标注