로컬 사용자의 실제 이름과 비밀번호 만료 정보를 출력하는 스크립트를 작성해야 합니다.
이것이 내가 지금 가지고 있는 것입니다. 어떤 도움이라도 대단히 감사하겠습니다.
$ 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
더 나은 가독성을 위해 루프를 사용하여 파일을 반복합니다.