這條命令幫我在一分鐘內修改了200臺遠程服務器密碼!

上週領導讓我短時間修改200多臺服務器的密碼,我一臉矇蔽,手動通宵改??不存在的,經過大佬指點,也總結了一些特別好的方法,讓我免受了加班之苦。好了,下面讓我們一起聊聊服務器之間遠程交互的一些有趣的遭遇和處理方式,把好的方法分享給大家。

目錄

一、遭遇和機遇

二、技術分享

1.什麼是sshpass

2.安裝 sshpass

3.sshpass用法(不用做免密):


一、遭遇和機遇

就在上週,週五臨近下班,經理突然找我說說:“阿杰,下午領導開會提到了咱們公司安全性的問題,我們發現很多服務器的管理員(root)密碼都設的太簡單了,都是六個1啥的(其實,密碼都是這位經理自己設的),你給統一改一改,服務器列表你找大黃【註釋↓↓】要一下,密碼就改成那種既複雜、又好記、含義能代表公司、而且高大上一些的就行,改完你就下班吧。

eg:大黃,人名,真名黃鯤鵬,平時管他叫鵬哥,一個憨厚老實的運維工作者,和我有些交情,中午經常蹭他飯卡;鵬哥曾多次因感情問題跳樓未遂,被我攔下,說起來我還算是他的救命恩人。

我吐了!明天不行?

於是我來找鵬哥要服務器的IP列表,尋思花個把小時手動改了唄,等鵬哥發給我一個8KB的txt文件時,我就感覺沒那麼簡單!果然,服務器加各種虛擬機、測試機大概200多臺。這TM是不打算讓我下班咯??我突然想到了一系列可能的遭遇。

於是我開始忙活起來,半小時過去了。。。才改好不到十分之一。

正好鵬哥準備撤了,看到我一臉黑,過來問我說:“阿杰我看你印堂發黑啊,也遇到感情危機啦?別想不開啊!”

我去。。。我哪有,經理要我遠程改200多臺服務器root用戶的密碼。我這得改到明天啊鵬哥,有沒有好辦法啊?

說着,鵬哥嘴角揚起十餘年資深運維大佬的微笑。“沒這麼麻煩,看我給你寫條shell命令解放你。”然後給我啪啪啪敲出一條命令。

640?wx_fmt=jpeg
來自胖哥博客的大神

命令如下:

# 作用:把192.168.101.91服務器原密碼:111111改成Softsec@2020CN
sshpass -p "111111" ssh -o StrictHostKeyChecking=no [email protected] "echo 'Softsec@2020CN' |passwd --stdin root"

乍一眼讓我看不到有啥特別的,待他執行後,竟然直接生效了。

我挺驚訝的問道:“這就可以了麼?這爲啥沒有提示輸密碼啥的?”

鵬哥解釋道:“是這樣,一般ssh遠程命令就得輸入密碼,修改密碼時還要輸入兩次密碼,但上面的命令分別屬於強制執行了這兩部分。”

是通過sshpass這個插件遠程連接了服務器192.168.101.91的root用戶,sshpass的原理跟expect插件類似,就是模擬了人工輸入密碼。

但sshpass有個問題,當終端首次連接某個服務器時,都會有個“Are you sure you want to continue connecting (yes/no)?  ”的提示,這樣就沒法連接,但是加上“-o StrictHostKeyChecking=no”參數,即可解決這個問題。

  • 第二部分:echo 'Softsec@2020CN' |passwd --stdin root

@這個命令意思是:修改root用戶密碼,且輸入新密碼默認填寫前面的內容“Softsec@2020CN”。

“這樣一來就可以一條命令成功修改任何服務器密碼啦,一次性使用的話就弄簡單些,直接複製200條這命令,然後批量修改命令中參數放到shell腳本中運行就闊以了。” 鵬哥說完一樂,拍拍屁股準備走人了~ 

“哎呀我太菜了,多謝鵬哥啊!”他也擺擺手示意不客氣,來了句“咱們菜雞互助”哈哈。

我趕緊複製了200來條命令,用正則批量替換了各IP和密碼,一執行,一分鐘不到,搞定!!

一看時間還不到8點,爲了慶祝挽回的這一次加班,我趕緊測試了一遍,並把使用的一些細節和技術點總結記錄下來分享給大家。

二、技術分享

1.什麼是sshpass

sshpass是一個很棒的免交互SSH登錄工具,ssh與sshpass的區別

  • ssh登錄需要與用戶進行交互,需要用戶輸入密碼,做了免密除外。
  • sshpass 允許使用-p參數指定明文密碼(相對不安全,用戶密碼可以通過history查到,或導致被泄露)

在大多數情況下,Linux 系統管理員使用 SSH 登錄到程 Linux 服務器時,要麼是通過密碼,要麼是無密碼 SSH 登錄或基於密鑰的 SSH 身份驗證。

如果你想自動在 SSH 登錄提示符中提供密碼和用戶名怎麼辦(想跟命令寫到一起)?這時 sshpass 就可以幫到你了。

sshpass 是一個簡單、輕量級的命令行工具,通過它我們能夠向命令提示符本身提供密碼(非交互式密碼驗證),這樣就可以通過 cron 調度器執行自動化的 shell 腳本進行對遠程服務器的各種操作。

ssh 直接使用 TTY 訪問,以確保密碼是用戶鍵盤輸入的。 sshpass 在專門的 tty 中運行 ssh,以誤導 ssh 相信它是從用戶接收到的密碼。

重要:使用 sshpass 是最不安全的,因爲所有系統上的用戶在命令行中通過簡單的 “history”、“ps” 等命令就可看到密碼。因此,如果必要,比如說在生產環境,我強烈建議使用SSH 免密,老套路吃得香。

當然,也可以使用-f參數從指定文件中讀取密碼

echo 'password' >mypasswd.txt

sshpass -f mypasswd.txt ssh user@ip

使用-e參數從環境變量中獲取ssh密碼     

export SSHPASS= "password"

sshpass -e ssh user@ip

2.安裝 sshpass

A.在基於 RedHat/CentOS 的系統中,首先需要啓用 EPEL 倉庫並使用 yum 命令安裝它。

yum install sshpass 

B.在 Debian/Ubuntu 和它的衍生版中,你可以使用 apt-get 命令來安裝。

sudo apt-get install sshpass 

C.另外,你也可以從最新的源碼安裝 sshpass,首先下載源碼並從 tar 文件中解壓出內容:

1、下載:目前1.0.6是最新版本,下載地址:

wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz

2、編譯安裝

tar -xvf sshpass.tar.gz

cd sshpass-1.06

./configure

make && make install

# 查看安裝成功與否:

sshpass -V

安裝可能出現的問題:

No Package sshpass available

解決方式:

sudo yum install epel-release

安裝完之後,再次嘗試安裝sshpass,問題搞定。
 

3.sshpass用法(不用做免密):

情景1:遠程操作服務器,刪除遠程服務器/tmp/test下所有文件,注意:這裏的""冒號記得加上,如果不加,則會在本地執行該命令而不是遠程的服務器

sshpass -p {密碼} ssh -o StrictHostKeyChecking=no {用戶名}@{主機IP} "rm -rf /tmp/test"
#例:sshpass -p password ssh -o StrictHostKeyChecking=no [email protected] "rm -rf /tmp/test"


情景2:將/home/test.txt文件發送到遠程服務器的/home/local/目錄下

sshpass -p {密碼} scp -o StrictHostKeyChecking=no /home/test.txt {用戶名}@{主機IP}:/home/local/
#例:sshpass -p {密碼} scp -o StrictHostKeyChecking=no /home/test.txt [email protected]:/home/local/


 

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