格式化 ch 命令日期输出

格式化 ch 命令日期输出

我想要一个脚本来直观地警告系统上的用户他们的密码即将过期。我找到了这个这里

事实是,该脚本的作者通过将日期转换为秒数,减去秒数再转换为天数来获取密码过期的天数。

问题是我的系统将这些日期输出为“2018 年 8 月 8 日”(今天)。如果我坚持使用 date 命令将日期转换为秒,就像作者所做的那样,那么我会收到错误:无效日期“2018 年 8 月 8 日”。

有什么帮助吗?

以下是完整脚本:

#! /bin/bash
# Issue a desktop notification if the user password is about to expire
# Uses the "chage" command frome the "passwd" package (likely installed)
# Best added to the session startup scripts

# get password data in array
saveIFS=$IFS
IFS=$'\n'
chagedata=( $(chage -l $USER | cut -d ':' -f 2 | cut -d " " -f 2-) )    
IFS=$saveIFS

# obtain times in seconds
now=$(date +%s)
expires=$(date +%s -d "${chagedata[1]}")

# compute days left (roughly...)
daysleft=$(( ($expires-$now)/(3600*24) ))
echo "Days left: $daysleft" 
# leave some evidence that the script really ran at startup
echo "Days left: $daysleft" > /var/tmp/$(basename $0).out

# determine and send the notification (stays mute if outside the warning period) 
if [[ $daysleft -le 0 ]]
then
    notify-send -i face-worried.png -t 0 "Password expiration" "Your password expires within a day"'!' 
elif [[ $daysleft -le ${chagedata[6]} ]]
then
    notify-send -i face-smirk.png -t 0 "Password expiration" "Your password expires in $daysleft days."
fi

答案1

根据date文档当前输入必须采用与语言环境无关的格式。他们建议使用LC_TIME=C来生成与语言环境无关的日期输出。对于您的情况,您必须在命令前面添加前缀chage,以使其输出date能够解析的日期字符串:

chagedata=( $(LC_TIME=C chage -l $USER | cut -d ':' -f 2 | cut -d " " -f 2-) )

相关内容