#!/usr/bin/ksh93 ################################################################ function usagemsg_id_k93 { print -- " Program: id_k93 The id_k93 function writes to standard output a message containing the system identifications (ID) for a specified user. The system IDs are numbers which identify users and user groups to the system. Usage: ${1##*/} [-vV] [ { -G | -g [ -r ] | -u [ -r ] } [ -n ] ] [ User ] Where: -v = Verbose mode -V = Very Verbose mode -G = Specifies that the id_k93 function write the effective, real, and supplementary group IDs only. If there are multiple entries for the effective, real, or supplementary IDs, they are separated by a space and placed on the same line. -g = Specifies that the id_k93 function write only the group ID. -u = Specifies that the id_k93 function write only the user ID. -r = Specifies that the id_k93 function write the real ID instead of the effective ID. This flag can be invoked with either the -g flag to write the real group ID, or the -u flag to write the real user ID. -n = Specifies that the id_k93 function outputs the name, instead of the ID number, when it is specified with the -G, -g, and -u flags. User = Specifies the login name of a user for the id_k93 function. If no user is specified, the user invoking the id_k93 function is the default. Author: Dana French (dfrench@mtxia.com) Copyright 2004 \"AutoContent\" enabled" return 0 } ################################################################ #### #### Description: #### #### The id_k93 function writes to standard output a message #### containing the system identifications (ID) for a #### specified user. The system IDs are numbers which #### identify users and user groups to the system. #### #### Assumptions: #### #### Dependencies: #### #### Products: #### #### Configured Usage: #### #### Details: #### ################################################################ function id_k93 { typeset TRUE="0" typeset FALSE="1" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset ONLYGID="${FALSE}" typeset ONLYGRP="${FALSE}" typeset ONLYUSR="${FALSE}" typeset REALIDS="${FALSE}" typeset NAMEOUT="${FALSE}" typeset USERNAME typeset PWDUSER typeset PWDPWD typeset PWDUID typeset PWDGID typeset PWDGECOS typeset PWDHOME typeset PWDSHELL typeset EUID typeset EGID while getopts ":GgurnvV" OPTION do case "${OPTION}" in 'G') ONLYGID="${TRUE}";; 'g') ONLYGRP="${TRUE}";; 'u') ONLYUSR="${TRUE}";; 'r') REALIDS="${TRUE}";; 'n') NAMEOUT="${TRUE}";; 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; '?') usagemsg_id_k93 "${0}" && return 1 ;; esac done shift $(( ${OPTIND} - 1 )) ################################################################ #### #### Obtain the target username from the first command line #### argument, if NULL determine the target username from #### the existing environment variable LOGIN. If this value #### is NULL use LOGNAME, if still NULL use USER. If still #### NULL exit with an error message. #### USERNAME="${1:-${LOGIN}}" USERNAME="${USERNAME:-${LOGNAME}}" USERNAME="${USERNAME:-${USER}}" USERNAME="${USERNAME:?ERROR: Unable to determine user name}" #### #### Read each line of the /etc/passwd file and match the #### target username against each username listed in the #### file. When a match is found, save the UID and GID #### values for later use and stop processing the file. #### while IFS=":" read -- PWDUSER PWDPWD PWDUID PWDGID PWDGECOS PWDHOME PWDSHELL do if [[ "_${PWDUSER}" = "_${USERNAME}" ]] then EUID="${PWDUID}" EGID="${PWDGID}" break fi done < /etc/passwd if [[ "_${EUID}" == "_" ]] || [[ "_${EGID}" == "_" ]] then print -u 2 -- "# ${0}: ${USERNAME}: No such user" return 1 fi #### If the "-u" option was entered on the command line, #### output the UID number and exit the function. (( ONLYUSR == TRUE && NAMEOUT == FALSE )) && print "${EUID}" && return 0 #### If the "-u" and "-n" options were entered on the #### command line, output the username and exit the function. (( ONLYUSR == TRUE && NAMEOUT == TRUE )) && print "${USERNAME}" && return 0 #### If the "-g" option was entered on the command line, #### output the GID number and exit the function. (( ONLYGRP == TRUE && NAMEOUT == FALSE )) && print "${EGID}" && return 0 #### #### Read each line from the /etc/group file to determine the #### group name associated with the GID number extracted from #### the user record in the /etc/passwd file. Assign this #### group name as the primary group. #### while IFS=":" read -- GRPNAME GRPPWD GRPGID GRPUSERS do if [[ "_${EGID}" = "_${GRPGID}" ]] then PRIMARYGROUP="${GRPNAME}" break fi done < /etc/group #### If the "-g" and "-n" options were entered on the #### command line, output the primary group name and exit the function. (( ONLYGRP == TRUE && NAMEOUT == TRUE )) && print "${PRIMARYGROUP}" && return 0 #### #### To ensure empty arrays, incase multiple user names are #### allowed on the command line, unset the arrays used to #### contain the list of secondary group names and GID #### numbers. #### unset GRPNAMLIST unset GRPGIDLIST #### #### Use a counter to keep track of the GID order in the #### array. Since the GID number may be greater than the #### allowed size of a korn shell array, a separate counter #### is used. #### CNT=0 #### #### Loop through each line of the /etc/group file and #### determine what groups the username is associated with. #### When a group is found, store the group name and the GID #### number in separate arrays to preserve the numerical #### order. #### while IFS=":" read -- GRPNAME GRPPWD GRPGID GRPUSERS do (( GRPGID == EGID )) && continue if [[ "_${GRPUSERS}" = _${USERNAME} ]] || [[ "_${GRPUSERS}" = _${USERNAME},* ]] || [[ "_${GRPUSERS}" = _*,${USERNAME},* ]] || [[ "_${GRPUSERS}" = _*,${USERNAME} ]] then GRPNAMLIST[CNT]="${GRPNAME}" GRPGIDLIST[CNT]="${GRPGID}" (( CNT++ )) fi done < /etc/group #### If the '-G' option was entered on the command line, #### print the GID number of the primary group. If the '-n' #### option was also used, print the primary group name, #### otherwise print the normal 'id' command output. if (( ONLYGID == TRUE && NAMEOUT == FALSE )) then print -r -n -- "${EGID}" elif (( ONLYGID == TRUE && NAMEOUT == TRUE )) then print -r -n -- "${PRIMARYGROUP}" else print -r -n -- "uid=${EUID}(${USERNAME}) gid=${EGID}(${PRIMARYGROUP})" (( ${#GRPGIDLIST[*]} != 0 )) && print -r -n -- " groups=" fi #### #### Loop through each stored secondary GID associated with the #### user and print as specified by the command line options. #### COMMA="" for GRP in "${!GRPGIDLIST[@]}" do #### #### If the '-G' option was specified on the command line, #### the print the secondary group GID number. If the '-n' #### option was also specified, print the secondary group #### name. Otherwise print the normal 'id' command output. #### if (( ONLYGID == TRUE && NAMEOUT == FALSE )) then print -r -n -- " ${GRPGIDLIST[${GRP}]}" elif (( ONLYGID == TRUE && NAMEOUT == TRUE )) then print -r -n -- " ${GRPNAMLIST[${GRP}]}" else print -r -n "${COMMA}${GRPGIDLIST[${GRP}]}(${GRPNAMLIST[${GRP}]})" COMMA="," fi done #### Up to this point, no CR characters have been printed, #### since all output is now complete, send a CR character. print #### Return to the calling function with a successful #### return code. return 0 } ################################################################ #### Call the id function with all command line arguments. id_k93 "${@}"