11#! /usr/bin/env bash
22
3- passwd_file=` mktemp`
3+ passwd_file=$( mktemp)
4+ readonly AWK_PRINT_FIRST_FIELD=' {print $1}'
45
56# getpwent returns duplicate entries for root and nobody users
67# due to a bug in systemd-userdb.service that occurs
78# in systemd 245
89# https://github.com/systemd/systemd/issues/15160
9- if which systemctl & > /dev/null && \
10- [[ ` systemctl --version | grep " systemd 245" ` =~ " 245 " ]] ; then
10+ if command -v systemctl > /dev/null 2>&1 && \
11+ systemctl --version | grep -q " systemd 245" ; then
1112 grep -Ev ' ^(root|nobody)' /etc/passwd > " $passwd_file "
1213else
13- case ` uname` in
14+ case " $( uname) " in
1415 # BSD passwd files may contain comments that are ignored by getpwent(3).
1516 Darwin|FreeBSD)
1617 grep -Ev ' ^(#|$)' /etc/passwd > " $passwd_file "
2223 esac
2324fi
2425
25- LINES_COUNT=` cat " $passwd_file " | wc -l`
26+ LINES_COUNT=$( wc -l < " $passwd_file " )
2627
2728function getField {
28- LINE=` sed -n " ${I} p" " $passwd_file " `
29- case $1 in
29+ local field_name=" $1 "
30+ local line_number=" $2 "
31+ local line
32+ local username
33+
34+ line=$( sed -n " ${line_number} p" " $passwd_file " )
35+ username=$( echo " $line " | awk -F' :' " $AWK_PRINT_FIRST_FIELD " )
36+
37+ case " $field_name " in
3038 ' username' )
31- echo $LINE | awk -F ' : ' ' {print $1} '
39+ echo " $username "
3240 ;;
3341 ' password' )
34- echo $LINE | awk -F' :' ' {print $2}'
42+ echo " $line " | awk -F' :' ' {print $2}'
3543 ;;
3644 ' user_id' )
37- case ` uname` in
45+ case " $( uname) " in
3846 FreeBSD)
39- id -u " ` echo $LINE | awk -F ' : ' ' {print $1} ' ` "
47+ id -u " $username "
4048 ;;
4149 Darwin)
42- id -u " ` echo $LINE | awk -F ' : ' ' {print $1} ' ` "
50+ id -u " $username "
4351 ;;
4452 * )
45- echo $LINE | awk -F' :' ' {print $3}'
53+ echo " $line " | awk -F' :' ' {print $3}'
4654 ;;
4755 esac
4856 ;;
4957 ' group_id' )
50- case ` uname` in
58+ case " $( uname) " in
5159 FreeBSD)
52- id -g " ` echo $LINE | awk -F ' : ' ' {print $1} ' ` "
60+ id -g " $username "
5361 ;;
5462 Darwin)
55- id -g " ` echo $LINE | awk -F ' : ' ' {print $1} ' ` "
63+ id -g " $username "
5664 ;;
5765 * )
58- echo $LINE | awk -F' :' ' {print $4}'
66+ echo " $line " | awk -F' :' ' {print $4}'
5967 ;;
6068 esac
6169 ;;
6270 ' gcos' )
63- echo $LINE | awk -F' :' ' {gsub(/&/,"&",$5); print $5}'
71+ echo " $line " | awk -F' :' ' {gsub(/&/,"&",$5); print $5}'
6472 ;;
6573 ' home_dir' )
66- echo $LINE | awk -F' :' ' {print $6}'
74+ echo " $line " | awk -F' :' ' {print $6}'
6775 ;;
6876 ' login_shell' )
69- echo $LINE | awk -F' :' ' {print $7}'
77+ echo " $line " | awk -F' :' ' {print $7}'
7078 ;;
7179 esac
7280}
129137while [ $I -le $LINES_COUNT ]; do
130138 cat << EOF
131139 <password_object version="1" id="oval:1:obj:${I} " xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#unix">
132- <username>` getField " username" ${I} ` </username>
140+ <username>$( getField " username" " ${I} " ) </username>
133141 </password_object>
134142EOF
135143 I=$[$I +1]
@@ -145,13 +153,13 @@ I=1
145153while [ $I -le $LINES_COUNT ]; do
146154 cat << EOF
147155 <password_state version="1" id="oval:1:ste:${I} " xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#unix">
148- <username>` getField ' username' $I ` </username>
149- <password>` getField ' password' $I ` </password>
150- <user_id datatype="int">` getField ' user_id' $I ` </user_id>
151- <group_id datatype="int">` getField ' group_id' $I ` </group_id>
152- <gcos>` getField ' gcos' $I ` </gcos>
153- <home_dir>` getField ' home_dir' $I ` </home_dir>
154- <login_shell>` getField ' login_shell' $I ` </login_shell>
156+ <username>$( getField ' username' " $I " ) </username>
157+ <password>$( getField ' password' " $I " ) </password>
158+ <user_id datatype="int">$( getField ' user_id' " $I " ) </user_id>
159+ <group_id datatype="int">$( getField ' group_id' " $I " ) </group_id>
160+ <gcos>$( getField ' gcos' " $I " ) </gcos>
161+ <home_dir>$( getField ' home_dir' " $I " ) </home_dir>
162+ <login_shell>$( getField ' login_shell' " $I " ) </login_shell>
155163 </password_state>
156164EOF
157165 I=$[$I +1]
0 commit comments