| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #!/bin/bash
- set -e
- IFS=$'\n'
- userPasswds=( $(docker run --rm --user 0:0 --entrypoint cut "$1" -d: -f1-2 /etc/passwd) )
- userShadows=()
- if grep -qE ':x$' <<<"${userPasswds[*]}"; then
- userShadows=( $(docker run --rm --user 0:0 --entrypoint cut "$1" -d: -f1-2 /etc/shadow || true) )
- fi
- unset IFS
- declare -A passwds=()
- for userPasswd in "${userPasswds[@]}"; do
- user="${userPasswd%%:*}"
- pass="${userPasswd#*:}"
- passwds[$user]="$pass"
- done
- for userShadow in "${userShadows[@]}"; do
- user="${userShadow%%:*}"
- if [ "${passwds[$user]}" = 'x' ]; then
- pass="${userShadow#*:}"
- passwds[$user]="$pass"
- fi
- done
- ret=0
- for user in "${!passwds[@]}"; do
- pass="${passwds[$user]}"
- if [ -z "$pass" -o '*' = "$pass" ]; then
- # '*' and '' mean no password
- continue
- fi
- if [ "${pass:0:1}" = '!' ]; then
- # '!anything' means "locked" password
- #echo >&2 "warning: locked password detected for '$user': '$pass'"
- continue
- fi
- if [ "${pass:0:1}" = '$' ]; then
- # gotta be crypt ($id$salt$encrypted), must be a fail
- echo >&2 "error: crypt password detected for '$user': '$pass'"
- ret=1
- continue
- fi
- echo >&2 "warning: garbage password detected for '$user': '$pass'"
- done
- exit "$ret"
|