run.sh 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/bin/bash
  2. set -e
  3. IFS=$'\n'
  4. userPasswds=( $(docker run --rm --user 0:0 --entrypoint cut "$1" -d: -f1-2 /etc/passwd) )
  5. userShadows=()
  6. if grep -qE ':x$' <<<"${userPasswds[*]}"; then
  7. userShadows=( $(docker run --rm --user 0:0 --entrypoint cut "$1" -d: -f1-2 /etc/shadow || true) )
  8. fi
  9. unset IFS
  10. declare -A passwds=()
  11. for userPasswd in "${userPasswds[@]}"; do
  12. user="${userPasswd%%:*}"
  13. pass="${userPasswd#*:}"
  14. passwds[$user]="$pass"
  15. done
  16. for userShadow in "${userShadows[@]}"; do
  17. user="${userShadow%%:*}"
  18. if [ "${passwds[$user]}" = 'x' ]; then
  19. pass="${userShadow#*:}"
  20. passwds[$user]="$pass"
  21. fi
  22. done
  23. ret=0
  24. for user in "${!passwds[@]}"; do
  25. pass="${passwds[$user]}"
  26. if [ -z "$pass" -o '*' = "$pass" ]; then
  27. # '*' and '' mean no password
  28. continue
  29. fi
  30. if [ "${pass:0:1}" = '!' ]; then
  31. # '!anything' means "locked" password
  32. #echo >&2 "warning: locked password detected for '$user': '$pass'"
  33. continue
  34. fi
  35. if [ "${pass:0:1}" = '$' ]; then
  36. # gotta be crypt ($id$salt$encrypted), must be a fail
  37. echo >&2 "error: crypt password detected for '$user': '$pass'"
  38. ret=1
  39. continue
  40. fi
  41. echo >&2 "warning: garbage password detected for '$user': '$pass'"
  42. done
  43. exit "$ret"