2010年12月13日

[Shell Script] 批次修改使用者的密碼有效期限 - V2

之前寫過一篇[Shell Script] 批次修改使用者的密碼有效期限 - V1,當時是自己寫了一個有點囉唆的 shell script 來處理這樣的需求,最麻煩的問題是「如何判斷哪些帳號是使用者帳號」,過濾 /etc/passwd 檔案有以下困難:

  1. 在 RHEL 系統中,通常使用者帳號的 uid 是從 500 開始,但是在 Solaris 系統中是從 100 開始。
  2. 上次寫的:加強過濾 /etc/passwd 檔案時使用的 regular expression,雖然目前實務上接觸到的主機還不至於帳號多到 uid > 600 或者更高,但可以當作一個練習 regular expression 的機會。<--相當麻煩
最近又要去修改使用者密碼的到期日(每三個月就要做一次),因為不想再跑這個很麻煩的 script,因此研究出一個更方便的指令,主要是以 echo -e 搭配 xargs 來完成。

要設定「密碼有效期為90天」以及「密碼到期前30天警告」可使用以下指令:

echo -e "account1\naccount2" | xargs -i chage -M 90 -W 30 {}

echo 加上 -e 參數後會讓兩個帳號間的「\n」換行字元生效(不加 -e 的話 xargs 會收到「account1\naccount2」這個完整的字串),再搭配 xargs -i 的置換效果({}會被置換成透過 pipeline 接收的字元),上面一行指令相當於下面兩行指令:

chage -M 90 -W 30 account1
chage -M 90 -W 30 account2


這樣的寫法的彈性在於,要 echo 哪些帳號出來完全可以自由控制,不用考慮不同系統中 uid 的起始數字不同,也不用考慮例外狀況。


在我管的系統中每個 OS 中的帳號都類似(大概是5~8個),透過 xargs 可以把 5~8 行指令濃縮成一行執行,非常省事。

接下來的幾個指令就依樣畫葫蘆:

  • 檢查上述指令是否生效:echo -e "account1\naccount2" | xargs -i chage -l {}
  • 設定最後一次變更密碼的日期:echo -e "account1\naccount2" | xargs -i chage -d YYYY-MM-DD {}
  • 在 Unix 系統(e.g., Solaris)上設定密碼90天到期、到期30天前提醒:echo -e "account1\naccount2" | xargs -i passwd -x 90 -w 30 {}(Solaris預設沒有 chage 指令)

xargs 真的是非常好用,下一篇再來介紹怎樣用 find、sed 搭配 xargs 來批次修改 awstats 統計資料檔(純文字檔)的內容。

參考:[2010-03-17] [Shell Script] 批次修改使用者的密碼有效期限 - V1



沒有留言:

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D