bergman on 12 Nov 2011 19:57:35 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PLUG] Finding a /etc/group entry containing a user list |
In the message dated: Sat, 12 Nov 2011 18:41:29 EST, The pithy ruminations from Fred Stluka on <Re: [PLUG] Finding a /etc/group entry containing a user list> were: => JP, => => > Of course, the flip side is that other users in group15 will have => > perms they don't need. I don't really care too much for this => > purpose, but usually that would matter. So maybe this question is => > less useful than I thought at first and yet-another-group really => > is the best answer. Not always. Don't forget that users were limited to being in 16 groups, and many programs, paricularly NFS, use structure with that limit.[1]. The various tools (usermod, getent, etc.) will allow you to 'add' a user to more groups and will report that the user is in those groups...but things that depend on that group membership won't always work. [1] http://blogs.oracle.com/peteh/date/20050614 (get past the icky 'oracle.com' URL that used to read 'sun.com', and realize that much of that--notably the NFS stuff--does apply to Linux) [SNIP!] => => --Fred => => On 11/12/11 2:38 PM, JP Vossen wrote: => > On 11/12/2011 02:30 PM, David Coulson wrote: => >> Just run 'id' against each username and parse out the output. Remember => >> /etc/group is typically just for supplemental groups - The user's => >> primary group is usually only in /etc/passwd. Hmmm.... I wouldn't 'parse /etc/group' directly, as group info could be stored in other places (NIS tables, LDAP, etc). It's safer to use "getent" (which will use the data sources & precedence defined in /etc/nsswitch.conf) to retrieve group information. => t => > helps me; it seems like I'd still need to parse stuff into some kind of data structure so I ca => n => > get my answer. => > => > Maybe I need an example. => > => > If I have user01 to user10 (decimal, not binary :), and group01 to group40, I want to know tha => t, => > say, group15 contains 8 out of 10 of my users, so if I can add user09 and user10 to group15, => > everyone will have the right perms once I chgrp the dir tree. You could probably do something vaguely like this pseudo-code: ############################################################################## # Given a list of users as arguments, compute # the score for each group that has any of those # users as a member, and print the group[s] with the # highest score ##### foreach user $ARGV[0] { foreach group `getent group | grep $user` $SCORE{$group}++; } foreach group ( keys($SCORE) ) { if ( $SCORE{$group} = $highscore ) { # this group has the same score as the # current high score $highgroups="$highgroups $group" } if ( $SCORE{$group} > $highscore ) { # we have a new high score $highgroups="$group" $highscore=$SCORE{$group} } } printf "The group[s] \"$highgroups\" have the largest number ($highscore) of members of the specified users" #################################################### Mark ___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug