1. 程式人生 > >一次性同步修改多臺linux伺服器的密碼

一次性同步修改多臺linux伺服器的密碼

如何一次性修改多臺linux伺服器的密碼,這是個問題,
我給大家提供一個指令碼,是前一段我剛剛寫的,希望能對大家有所幫助


一 ,   需求:linux環境下執行,需要tcl和expect支援
      原理說明:利用expect的摸擬互動的功能,登入到指定的多臺伺服器上修改密碼
                共2個程式檔案 passall.sh和passone
                 另外使用者需要自建一個ip地址列表檔案,每行一個ip
二,程式程式碼:
//-----------------------------------程式檔案一---------------------------------------
passall.sh
#!/bin/bash
if [ "$1" = "" ] || [ "$2" = "" ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]
then
        echo "usage: passall.sh /path/ip_list.txt /path/passone"
        exit
fi
cat $1 | while read line
do
    # if ==null
    [ -z $line ] && continue
    $2 $line;
done
echo -e "/n/npass mod OK!/n"


passone
//-----------------------------------程式檔案二---------------------------------------
#!/usr/bin/expect -f

#-------------------------------------------------- about us
# product: passone
# Author: liuhongdi <
[email protected]
>
# Last Modified: 2008-05-13
# version: 0.2.2
# user:this script will help you to modify password for many linux(unix) machine
# license: this script is based GNU GPL

#-------------------------------------------------- set the variable,you can modify the value
set loginuser "testuser"                 
set loginpass {testpass}

set ifsu 1
set su_user "suroot"                 
set su_pass {surootpass}

set passuser "passusername"
set newpass "passuserpass"

set ipaddr [lrange $argv 0 0]  
set timeout 300
set cmd_prompt "]#|~]?"

set ifsshtest 1

#-------------------------------------------------- login by ssh
spawn ssh
[email protected]
$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"
  }
}

#---------------------------------------------------- if we need su
expect {
 -re $cmd_prompt {
    if {$ifsu==1} {
        send "su $su_user /r"
        expect -re "assword:"
        send "$su_pass/r"
    } else {
       send "/r"
    }
 }
}

#---------------------------------------------------- now,we modfiy the password

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"
 }
}

#---------------------------------------------------- now,need do a test?

if {$ifsshtest==1} {
   if {$ifsu==1} {
                expect -re $cmd_prompt
                send "exit/r"
   }
   expect -re $cmd_prompt
   send "exit/r"
  
          spawn ssh
[email protected]
$ipaddr
          expect {
              -re "assword:" {
                  send "$newpass/r"
             } -re "Permission denied, please try again." {
                  exit
             } -re "Connection refused" {
                 exit
            } timeout {
                 exit
            } eof {
                 exit
            }
         }
     
   }
   expect {
      -re $cmd_prompt {
          send "/r"
          send "/r"
          puts "ssh login test OK!"
          send "/r"
      }
   }


#--------------------------------------------------- ok,we exit
expect -re $cmd_prompt
send "/r"
exit
#interact

三,程式說明:
    1,passall.sh:bash指令碼,遍歷ip地址的列表檔案,然後分別登入到各臺機器上修改密碼,
     接受的引數有兩個: 分別是 ip地址列表的完整路徑,passone的完整路徑
     ip地址的列表檔案:放置ip地址的列表,只需要每行一個地址即可
    2,passone:  expect指令碼,
              接受的引數只有一個,就是ip地址
             其中可修改的變數的說明:

set loginuser "testuser"       //登入到伺服器上的使用者名稱            
set loginpass {testpass}      //登入到伺服器上的密碼

set ifsu 1                    //修改密碼前是否需切換到有許可權的使用者
set su_user "suroot"          //su到的使用者名稱      
set su_pass {surootpass}      //su到的使用者的密碼

set passuser "passusername"    //要修改的使用者的使用者名稱
set newpass "passuserpass"     //要修改的使用者的新密碼

set ipaddr [lrange $argv 0 0]   //接收到的引數,ip地址
set timeout 300                //超時的時間
set cmd_prompt "]#|~]?"          //登入到的伺服器的命令提示符,用 | 隔開

set ifsshtest 1                //是否通過再次ssh登入檢測修改密碼是否成功

四:用法舉例:
   /home/passuser/passall.sh  /home/passuser/mod_ip_list.txt /home/passuser/passone
   說明:  命令列中的passall.sh和passone請大家使用上面的程式碼,並做相應修改即可
          mod_ip_list.txt是需要使用者自建的ip列表檔案,內容舉例如下:
          192.168.1.5
          192.168.1.6
          192.168.1.7
五:這個要求在執行的機器上安裝有expect和tcl,大家可以用yum或apt等工具進行安裝

相關推薦

一次性同步修改linux伺服器密碼

如何一次性修改多臺linux伺服器的密碼,這是個問題,我給大家提供一個指令碼,是前一段我剛剛寫的,希望能對大家有所幫助一 ,   需求:linux環境下執行,需要tcl和expect支援      原理說明:利用expect的摸擬互動的功能,登入到指定的多臺伺服器上修改密碼                共2

關於解決linux伺服器間的檔案實時同步問題

  最近要做一個相關的解決方案,在虛擬機器測試沒有問題。給大家分享出來,有更好的解決方案,歡迎討論。 1.1 inotify相關介紹      1、rsync        與傳統的cp、ta

3,VMware 克隆Linux機器並修改IP等配置

克隆完伺服器後修改配置: 1,修改網絡卡配置        vi /etc/udev/rules.d/70-persistent-net.rules            刪除掉第一個網絡卡配置,將第二個網絡卡名稱修改成eth0        記錄下mac地址修改hw

Linux伺服器部署個tomcat

此例以配置2個Tomcat為例:1. 下載apache-tomcat-7.0.63,下載下來的檔案為apache-tomcat-7.0.63.zip2. 將檔案上傳至伺服器/usr/local目錄下3. 解壓該壓縮包,並重命名為tomcat1,另一個重新命名為tomcat24

Linux伺服器上同時部署個Tomcat方法需要注意事項

一、原理講解:  tomcat啟動可以通過兩個指令碼分別進行啟動  ./startup.sh 或者 catalina.sh run  形式執行啟動  其實startup.sh的啟動也是呼叫的catalina.sh,然後去啟動的,所以我們需要關注的就是catalina.sh檔案

CentOS伺服器時間同步(NTP時間同步

同一個程式執行在多臺伺服器上時,有時需要這些伺服器的時鐘相同,但是當伺服器執行一定時間之後,各個伺服器上的時鐘會有一定差異,此時就需要讓所有伺服器自動校準各自時鐘。 NTP是一個很方便的時鐘服務,可以用此來進行時鐘同步。 (以下解決應用於不連線外網的區域網,需求是同步所有伺服

Linux伺服器之間實現ssh免密碼連線

 假設現在我們有一個使用者,叫tom, 1.  啟動ssh ,  chkconfig iptables off service iptables stop service sshd start 然後在 tom 使用者下 ,ssh localhost 命令,點yes

在一Linux伺服器上安裝個MySQL例項(一)--使用mysqld_multi方式

(一)MySQL多例項概述例項是程序與記憶體的一個概述,所謂MySQL多例項,就是在伺服器上啟動多個相同的MySQL程序,執行在不同的埠(如3306,3307,3308),通過不同的埠對外提供服務。由於MySQL在一個例項下面可以建立多個數據庫,所以通常在一臺伺服器上只要安裝一個MySQL例項即可滿足使用。但

使用Python之paramiko模塊和threading實現線程登錄Linux服務器

python ssh paramikothreading 遠程 有時候我們需要在多臺Linux服務器上面執行同樣的命令,或者同樣的操作,如果我們每一臺單獨登錄上去做這樣太麻煩了,所以我們可以考慮使用自動化腳本來實現。我這裏使用Python多線程的方式,這樣速度更快,如果使用Sh

如何同時操作linux服務器

童鞋 技巧 for width ont get RM cap targe 如果你有多臺服務器想要運維,一般可以考慮ansible,puppet之類的,但是如果只是想簡單的在多臺服務器上執行一下命令,用xshell就可以了。 首先要把”撰寫欄”顯示出來,然後在“撰寫欄

記一次linux搭建zookeeper集群

tables hive sam conf accept keep server 查看 地方 自己搭建了zookeeper集群,使用了三臺linux,搭建三節點的集群,這裏記錄一下。 在linux上可以使用wget+網址+版本號,wget和網址之間有個空格,就可以直接在lin

使用python的paramiko模塊對機器更新密碼

str log def ddp -s gin __name__ main function 廢話不多說,直接上代碼 #!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import print_functi

管理Linux服務器的系統日誌

ima cde client rest 端口號 ets tar images nag 一、 部署服務端 1.給服務器和每個客戶機配IP 給服務器和每個客戶機加一塊網卡,改為橋接 dhclient -d eth1 ip a 2.開啟rsyslog服務的514號端口 vi

VMware 克隆Linux機器並配置IP的方法

1、檢視並分配虛擬網路   我們首先要知道 VMware 三種網路模式的區別。   ①、Bridged(橋接模式):就是將主機網絡卡與虛擬機器虛擬的網絡卡利用虛擬網橋進行通訊。在橋接的作用下,類似於把物理主機虛擬為一個交換機,所有橋接設定的虛擬機器連線到這個交換機的一個介面上,物理主機也同樣插在這個交換機

WMI實現遠端監控windows伺服器

簡介 WMI簡介: WMI(Windows Management Instrumentation,Windows 管理規範)是一項核心的 Windows 管理技術;使用者可以使用 WMI 管理本地和遠端計算機。 WQL簡介: WQL就是WMI中的查詢語言,WQL的全稱是WMI Que

linux伺服器想共享一個磁碟分割槽

可以使用NFS(網路檔案系統)來實現。 一、NFS服務簡介   NFS 是Network File System的縮寫,即網路檔案系統。一種使用於分散式檔案系統的協定,由Sun公司開發,於1984年向外公佈。功能是通過網路讓不同的機器、不同的作業系統能夠彼此分享個別的資料,讓應用程式在客戶端通過網路

VirtualBox配置Linux實現互相通訊(dhcp自動獲取)

1. 配置VirtualBox 在Virtualbox介面,選擇 管理-> 全域性設定,新增如下圖: 設定Linux網絡卡: 啟動Linux。 2. 配置網絡卡檔案 vim /etc/sysconfig/network-scripts/ifcfg-eth0

Linux機器上配置Jenkins任務

建立資料夾 mkdir jenkins 下載jenkins.war  cd jenkins && wget http://mirrors.jenkins.io/war/latest/jenkins.war 用nohup在後臺執行jenkins n

linux伺服器 掛載同一目錄共享目錄下的所有檔案

比如 登陸本地伺服器192.168.0.96 然後 開啟shell 執行如下命令 /bin/mount -t nfs 192.168.0.95:/opt/usr/huangye/tomcat/webapps/preview/upload      /opt/usr/file

scp 將資料從一linux伺服器複製到另一linux伺服器

scp 是secure copy的簡寫,用於在Linux下進行遠端拷貝檔案的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且 scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為只讀 read only system時,用scp可以幫你把檔