1. 程式人生 > >shell腳本中實現自動判斷用戶有無密碼

shell腳本中實現自動判斷用戶有無密碼

腳本 shell

在最近完成老師布置的作業的時候遇到了如何讓shell腳本中的命令自動判斷一個用戶是否已設置密碼的問題,雖然看似不是很難的一個問題,但是在這一功能實現的過程中卻包含了許多細小的而重要的知識。剛開始小編對此很是頭疼,雖然我們查看一個用戶是否有密碼並不是很難,直接cat /etc/shadow這個文件看看密碼位是否有加密的字符就行了,但是讓命令自己去判斷和匹配就不是很順利了,小編上網查看後,並沒有得到很好的答案,大多數都是人工查看的答案,並不適用於shell腳本中自動的判斷,所以在認真對比/etc/passwd /etc/shadow 這兩個文件之後,又結合自己的想法,實現了這個自動判斷的功能,接下來小編將我這一過程實現中遇到的問題和擴展的知識,羅列出來,以便於給像小編一樣沒有在網上找到合適答案的童鞋們參考,本文純屬個人思考產物,如有更好方法,請賜教。技術分享

我們知道用戶的密碼是存儲到/etc/passwd/etc/shadow這兩個文件中的,為什麽這麽說呢?因為當系統開啟了用戶的投影密碼後,才會把密碼映射到shadow這個文件中,如果沒有開啟投影密碼,則用戶的密碼是保存在passwd 這個文件中的,為了提高系統的安全性,一般這個功能是默認開啟的,但是我們可以手動將其關閉:pwconv開啟投影密碼,pwunconv關閉投影密碼。

為了接下來的命令實現,小編在這裏將passwd文件和shadow文件的關系進行圖形化的詳細分析,以便小夥伴們能看懂:

技術分享

如果沒有開啟影子密碼功能,則不會存在shadow這個文件,密碼就被保存在了passwd文件的密碼位上,此時,創建的用戶一直都沒有設置密碼的情況下,該密碼位是兩個!!符號,如果用戶的密碼通過passwd -d username 這個命令給清空的話,該密碼位上沒有任何東西。

如果開啟了影子密碼功能,passwd中密碼位的密碼將會投射到shadow中,同樣,如果用戶還沒設置過密碼,則密碼位為兩個!!符號,如果用戶的密碼通過passwd -d username 清空了的話,在shadow的密碼位上為空。

有圖有真相:

技術分享

存在上述的兩種情況啊!針對shell腳本而言,編寫的腳本要有較高的準確性和可移植性,所以命令的執行一定要有絕對的把握,如果我們定義查看匹配shadow文件,那如果有的主機上沒有開啟影子密碼功能,那麽找不到shadow這個文件,命令的執行結果就不對了,所以為了保證命令的絕對性,小編采用如下思想:

不管系統有沒有開啟影子投射功能,我們在進行篩選判斷之前,先執行pwconv命令開啟影子密碼功能。這樣一來,我們就完全的確定了密碼存在於shadow文件中,我們就可以針對shadow文件進行一些操作。


沒有密碼的情況有兩種,一種是密碼位為空,一種是密碼位一個!或!!,一個!是因為該用戶被鎖定了。如果用戶有密碼的情況是密碼位為:$加密方式編號$salt$密碼位” 所以我們可以將密碼位的參數提取出來運用正則表達式進行對比,如果不是“$加密方式編號$salt$密碼位”形式的參數,就說明該用戶沒有密碼。

開啟影子密碼的命令為:pwconv

提取shadow文件中密碼位參數的命令為:getent shadow |grep ^username |cut -d: -f2

這裏有圖:技術分享

技術分享

這裏截取的是一個用戶的密碼位。

將取出的參數進行匹配,判斷出是否有密碼:[[ "$(pwconv ;getent shadow |grep ^username |cut -d: -f2)" =~ ^‘$‘.* ]] && echo true || echo false

該命令中使用到了:

$( ):調用括號中的命令執行的結果

[[ ]]:條件測試,可以進行條件測試的還有 [ ],但是我們使用到了擴展正則表達式,而[ ]不支持引用正則表達式,所以我們使用雙引號的條件測試符。

=~:該符號是進行字符串的測試,含義為:左側字符串是否能夠被右側的PATTERN所匹配。

&&根據退出狀態而定,命令可以有條件地運行代表條件性的AND THEN ,根據前一條命令的返回值來判斷,返回值為真(0),則執行自身後面的命令。

||代表條件性的OR ELSE,若前一條命令的返回值為假(非0),則執行自身後面的命令。

命令執行的結果為:(兩種結果展示)

技術分享

技術分享

我們可以可以將用戶名設置為一個變量,通過傳遞的用戶名參數,實現指定用戶的查看,將這個方法用戶在shell腳本中,就可以進行有條件的判斷了。嘻嘻~

才學疏淺,如有不足請多多指點,如有你發現了更好的辦法,記得告訴小編哦!技術分享



本文出自 “Linux運維” 博客,請務必保留此出處http://jk6627.blog.51cto.com/12002684/1953876

shell腳本中實現自動判斷用戶有無密碼