Shell腳本:使用SSH登陸並更改密碼

平時運維中有時會遇到需要更改服務器的管理員密碼,如果服務器比較多的時候,我們可以編寫一個腳本來實現,省時省力。

linux使用SSH登陸時需 要手動輸入yes 來確認連接,所以首先要解決這個問題,讓腳本實現遠程執行命令無須人工干預。

第一步 使用ssh-keygen創建本機的公鑰和私鑰

創建成功後會在/root/.ssh下生成私鑰和公鑰

第二步 使用ssh-copy-id複製公鑰到遠程主機及expect內部命令編寫ssh自動登陸腳本

auto_ssh_copy_id () {

    expect -c "set timeout -1;

    spawn /usr/bin/ssh-copy-id -i /root/.ssh/id_rsa.pub root@$2;

    expect {

        *(yes/no)* {send -- yes\r;exp_continue;}

        *password:* {send -- $1\r;exp_continue;}

        eof{exit 0;}

    }";

}

調用方法:auto_ssh_copy_id $pass1 $ipnet.$i  

假設需要更改密碼的服務器IP 在172.18.0.1-172.18.0.100之間,腳本如下。

#!/bin/bash

#Program

#

#relase

#tryrus 20161029

ipnet=172.18.0   #改成實際的IP 段

declare i=1      #改成實際開始的IP

pass1=password1 #ssh遠程登陸root的密碼

pass2=password2   #要設定的新密碼

auto_ssh_copy_id () {

    expect -c "set timeout -1;

    spawn /usr/bin/ssh-copy-id -i /root/.ssh/id_rsa.pub root@$2;

    expect {

        *(yes/no)* {send -- yes\r;exp_continue;}

        *password:* {send -- $1\r;exp_continue;}

        eof{exit 0;}

    }";

}

auto_ssh_change_psw() {

    expect -c "set timeout -1;

    spawn ssh root@$2 "passwd";

    expect {

        *New* {send -- $1\r;exp_continue;}

        *Retype* {send -- $1\r;exp_continue;}

        eof{exit 0;}

    }";

}

while [[ "$i" -le "100" ]]      #控制循環,數值改成實際要使用的IP

    do

        ping "$ipnet.$i" -c 3 > /dev/null

        if [ $? -eq 0 ];then

            auto_ssh_copy_id $pass1 $ipnet.$i            #運行一次後,這行就不需要了

            auto_ssh_change_psw $pass2 $ipnet.$i            

        fi

    let "i+=1"

done

第二次測試結果


謝謝你打開這篇博文,並一直堅持看到了這裏,如果覺得對你有幫助,請不要吝嗇點一下右下角的贊。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章