로컬 사용자와 비밀번호 만료 날짜를 출력하는 스크립트 작성

로컬 사용자와 비밀번호 만료 날짜를 출력하는 스크립트 작성

로컬 사용자의 실제 이름과 비밀번호 만료 정보를 출력하는 스크립트를 작성해야 합니다.

이것이 내가 지금 가지고 있는 것입니다. 어떤 도움이라도 대단히 감사하겠습니다.

$ cat /etc/passwd | grep '/home' | cut -d: -f5 ;chage -l {} | \
    fgrep "Password expires"'| column -t

답변1

로컬 사용자를 얻는 더 좋은 방법은 사용자에게 유효한 로그인 셸이 있는지 확인하는 것입니다.

getent passwd | grep -f /etc/shells

작동하는 방법은 다음과 같습니다.

getent passwd | grep -f /etc/shells | tr ',' ':' | \
    awk -F: '{print $1, $5}' | while read USER NAME 
    do 
        echo $NAME:$(chage -l $USER| awk -F': ' '/Password expires/{print $2}')
    done | column -ts: 

이를 사용하여 xargs다음 작업을 수행할 수 있습니다.

getent passwd | grep -f /etc/shells | tr ',' ':' | awk -F: '{print $1, $5}' | \
    xargs -L1 bash -c 'echo ${@:2}:$(chage -l $1| awk -F": " "/Password expires/{print \$2}")' : | \
    column -ts: 
  • tr다음으로 바꾸기를 사용하면 GECOS 필드에서 직접 전체 이름을 추출할 ,수 있습니다 .:
  • column입력 구분 기호를 제공할 수 있으며 -s이를 통해 하나의 열에 여러 단어로 된 이름을 유지할 수 있습니다.
  • -L사용 xargs하다철사사용자 이름과 전체 이름이 각 명령에 전달되도록 각 명령에 대해 입력합니다.
  • ${@:2}- 두 번째 인수로 시작하는 모든 인수(첫 번째 인수 건너뛰기)

출력 예:

root                      never
Murukesh Mohanan          never
Guest                     never

답변2

xargs다음을 사용하여 결과를 반복 할 수 있습니다 .

$ grep '/home' /etc/passwd | cut -d: -f1 | xargs -n1 -I{} chage -l {} | \
    grep "Password expires" | column -t
Password  expires  :  never

이 변형에서는 스위치를 사용하여 xargs호출하므로 단일 사용자 이름 인수로만 호출됩니다 -n1. 호출할 때 인수를 넣을 위치를 표시할 수 있도록 매크로 로 사용하라고 지시 chage -l합니다 .-I{}xargs{}chage

답변3

cut -d: -f1,3,5 /etc/passwd | while IFS=: read -r user userid fullname
do
    if [ "$userid" -gt 500 ];
    then
    echo "Full Name: $fullname"
    echo "Password Expiry date: $(chage -l "$user" | head -2 | tail -1)"
    fi
done

/etc/passwd파일에 우리가 원하지 않는 시스템 사용자가 포함되는 경우가 많기 때문에 로컬 사용자를 확인하는 추가 단계를 추가했습니다 . 또한 while더 나은 가독성을 위해 루프를 사용하여 파일을 반복합니다.

관련 정보