分析
由於chage執行出來的結果為:
<pre class="c" name="code">Last password change : Jul 05, 2011
Password expires : never
Password inactive : never
Account expires : Aug 01, 2011
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
是要算出 Account expires 該值到今天有幾天,
如何解析 Aug 01, 2011 字樣的日期,
並可以與今天的日期相減,
就獲得結果。
可用的script
參考:Simple date and time calulation in BASH
提供了現成的 日期相減的bash計算,
修改成符合此問題的需求,
編輯 exp2now.sh
<pre class="c" name="code">#!/bin/bash
who=$USER
#who=${1:-$USER}
#mydate=`sudo chage -l $who |grep "Account expires" | awk -F: '{print $2}'`
mydate=`chage -l $who |grep "Account expires" | awk -F: '{print $2}'`
if echo $mydate | grep -q never
then
echo "never expire"
exit
fi
#echo "$@"
date2stamp () {
date --utc --date "$1" +%s
}
stamp2date (){
date --utc --date "1970-01-01 $1 sec" "+%Y-%m-%d %T"
}
dateDiff (){
case $1 in
-s) sec=1; shift;;
-m) sec=60; shift;;
-h) sec=3600; shift;;
-d) sec=86400; shift;;
*) sec=86400;;
esac
dte1=$(date2stamp $1)
dte2=$(date2stamp $2)
diffSec=$((dte2-dte1))
# if ((diffSec < 0)); then abs=-1; else abs=1; fi
# echo $((diffSec/sec*abs))
if ((diffSec < 0)); then abs=-1; plus=1; else abs=1;plus=0; fi
echo $((diffSec/sec*abs+plus))
}
# USAGE # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#mydate="$@"
#day1=`date --utc --date "$mydate" +%Y-%m-%d`
day1=`date --date "$mydate" +%Y-%m-%d`
dateDiff -d "$day1" "now"
其中的 2-5 行可以互相組合,
看是要怎麼用。
如果每個user只能看自己的:
<pre class="c" name="code">who=$USER
mydate=`chage -l $who |grep "Account expires" | awk -F: '{print $2}'`
如果希望管理者可以看任何人的:
<pre class="c" name="code">who=${1:-$USER}
mydate=`chage -l $who |grep "Account expires" | awk -F: '{print $2}'`
如果希望任何人看任何人的話:
<pre class="c" name="code">who=${1:-$USER}
mydate=`sudo chage -l $who |grep "Account expires" | awk -F: '{print $2}'`
這時要加上執行 visudo :
<pre class="c" name="code">%users ALL=NOPASSWD: /usr/bin/chage
才能讓任何人順利執行。
然後 chmod +x exp2now.sh 再移到 /usr/bin/ 或 /usr/local/bin
這樣任何人執行就可能會像是各不同的情形:
<pre class="c" name="code">$ exp2now
never expire
$ exp2now user1
25
$ exp2now user1
chage: Permission denied.
而相關的參數安全問題並未考量在其中,
依自行需要考量看開放的限度。
小結
解析日期及計算的問題,
其他程式語言也有容易解決的方案,
但這個 bash script 提供了處理日期的方便基礎。
<pre class="c" name="code">echo $[ $[ $(date -u -d "`LANG=C chage -l $USER | grep '^Password expires' | cut -d: -f2 | sed 's/ never/2038-01-19/'`" +%s) - $(date -u +%s) ] / 86400 + 1 ]
用這指令就能得到自己的密碼還有幾天過期。有一點要注意:如果過期日是 never,則會使用整數所能表示的最大日期 2038-01-19 來計算,得到九千多天。