BASH: 계정이 만료될 때까지의 일수 계산

BASH: 계정이 만료될 때까지의 일수 계산

목표: Linux 사용자 이름, 비밀번호 마지막 변경 사항, 비밀번호 만료를 사람이 읽을 수 있는 형식으로 출력합니다.

쉘을 사용하여 사용자 로부터 사용자 정보를 추출했습니다 /etc/passwd./etc/shadow/bin/bash

join -1 1 -2 1 -t : /etc/passwd /etc/shadow |grep bin/bash|awk -F\: '{print $1";"$9";$14}'
where
$1 = username
$9 = number of days since last password change, calculated from 1/1_1970
$14 = number of days to password expiry date, calculated from 1/1_1970

현재 날짜에 대해 9달러나 14달러 같은 숫자를 얻을 수 있어요

expr $(date +%S) /86400

질문: 현재 행에서 $9-$(date +%s)/86400 및 $14-$(date +%s)/86400의 값을 어떻게 출력합니까?

답변1

필드 8에는 /etc/shadow"비밀번호 만료 날짜"가 포함되어 있지 않지만 man shadow(Linux의 경우) 다음을 따릅니다.

계정 만료일

1970년 1월 1일 이후의 일수로 표시되는 계정 만료 날짜입니다. 계정 만료일은 비밀번호 만료일과 다르다는 점에 유의하세요. . . 빈 필드는 계정이 만료되지 않음을 의미합니다.

"비밀번호 만료"를 원하시나요, 아니면 "계정 만료"를 원하시나요?

귀하의 질문 에 대해 join추가 평가를 위해 모든 "그림자" 필드가 6씩 이동되었습니다. 이 grep명령은 필요하지 않습니다 awk. 다음 대사 중 하나를 적용해 보세요.

join -1 1 -2 1 -t : /etc/passwd /etc/shadow | awk -F: -v"TD=$(date +%s)" 'BEGIN {TD = TD / 86400} $7 ~ /bash$/ {print $1, int($9-TD), $14?int($14-TD):"never"}' OFS=";"
user1;-1429;never
user2;-1429;never

답변2

사용 방법 echo:

 echo "$(($9-$(date +%s)/86400 ))"

$((...))산술 확장입니다.

...in을 사용하면 $((...))산술 표현식으로 해석됩니다. 예를 들어, 16진수 문자열은 숫자로 해석되어 10진수로 변환됩니다. 그런 다음 전체 표현식은 표현식이 평가되는 숫자 값으로 대체됩니다.

$((...))쉘 단어 분할 및 파일 이름 와일드카드의 영향을 받지 않도록 따옴표로 묶어야 합니다.

또는

echo "$9-$(date +%s)/86400" | bc

bc수학 연산을 처리할 수 있는 기본 계산기를 나타냅니다.

관련 정보