목표: 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
수학 연산을 처리할 수 있는 기본 계산기를 나타냅니다.