iT邦幫忙

0

要如何得知USER剩幾天密碼過期?

請教各位前輩~
linux要如何得到自己的帳號剩幾天密碼會過期?
我目前的做法是用chage -l username去查,
但我想要得到剩餘天數...?

2 個回答

2
逮丸逮丸
iT邦大師 1 級 ‧ 2011-07-07 10:42:08

分析
由於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 提供了處理日期的方便基礎。

2
wiseguy
iT邦超人 1 級 ‧ 2011-09-25 12:34:03
<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 來計算,得到九千多天。

我要發表回答

立即登入回答