172 lines
4.2 KiB
Awk
172 lines
4.2 KiB
Awk
|
# id.awk --- implement id in awk
|
||
|
#
|
||
|
# Requires user and group library functions and getopt
|
||
|
#
|
||
|
# Arnold Robbins, arnold@skeeve.com, Public Domain
|
||
|
# May 1993
|
||
|
# Revised February 1996
|
||
|
# Revised May 2014
|
||
|
# Revised September 2014
|
||
|
# Revised September 2020
|
||
|
|
||
|
# output is:
|
||
|
# uid=12(foo) euid=34(bar) gid=3(baz) \
|
||
|
# egid=5(blat) groups=9(nine),2(two),1(one)
|
||
|
|
||
|
# Options:
|
||
|
# -G Output all group ids as space separated numbers (ruid, euid, groups)
|
||
|
# -g Output only the euid as a number
|
||
|
# -n Output name instead of the numeric value (with -g/-G/-u)
|
||
|
# -r Output ruid/rguid instead of effective id
|
||
|
# -u Output only effective user id, as a number
|
||
|
|
||
|
function usage()
|
||
|
{
|
||
|
printf("Usage:\n" \
|
||
|
"\tid [user]\n" \
|
||
|
"\tid -G [-n] [user]\n" \
|
||
|
"\tid -g [-nr] [user]\n" \
|
||
|
"\tid -u [-nr] [user]\n") > "/dev/stderr"
|
||
|
|
||
|
exit 1
|
||
|
}
|
||
|
BEGIN {
|
||
|
# parse args
|
||
|
while ((c = getopt(ARGC, ARGV, "Ggnru")) != -1) {
|
||
|
if (c == "G")
|
||
|
groupset_only++
|
||
|
else if (c == "g")
|
||
|
egid_only++
|
||
|
else if (c == "n")
|
||
|
names_not_groups++
|
||
|
else if (c == "r")
|
||
|
real_ids_only++
|
||
|
else if (c == "u")
|
||
|
euid_only++
|
||
|
else
|
||
|
usage()
|
||
|
}
|
||
|
if (groupset_only && real_ids_only)
|
||
|
usage()
|
||
|
else if (ARGC - Optind > 1)
|
||
|
usage()
|
||
|
if (ARGC - Optind == 0) {
|
||
|
# gather info for current user
|
||
|
uid = PROCINFO["uid"]
|
||
|
euid = PROCINFO["euid"]
|
||
|
gid = PROCINFO["gid"]
|
||
|
egid = PROCINFO["egid"]
|
||
|
for (i = 1; ("group" i) in PROCINFO; i++)
|
||
|
groupset[i] = PROCINFO["group" i]
|
||
|
} else {
|
||
|
fill_info_for_user(ARGV[ARGC-1])
|
||
|
real_ids_only++
|
||
|
}
|
||
|
if (groupset_only) {
|
||
|
if (names_not_groups) {
|
||
|
for (i = 1; i in groupset; i++) {
|
||
|
entry = getgrgid(groupset[i])
|
||
|
name = get_first_field(entry)
|
||
|
printf("%s", name)
|
||
|
if ((i + 1) in groupset)
|
||
|
printf(" ")
|
||
|
}
|
||
|
} else {
|
||
|
for (i = 1; i in groupset; i++) {
|
||
|
printf("%u", groupset[i])
|
||
|
if ((i + 1) in groupset)
|
||
|
printf(" ")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
print "" # final newline
|
||
|
exit 0
|
||
|
}
|
||
|
else if (egid_only) {
|
||
|
id = real_ids_only ? gid : egid
|
||
|
if (names_not_groups) {
|
||
|
entry = getgrgid(id)
|
||
|
name = get_first_field(entry)
|
||
|
printf("%s\n", name)
|
||
|
} else {
|
||
|
printf("%u\n", id)
|
||
|
}
|
||
|
|
||
|
exit 0
|
||
|
}
|
||
|
else if (euid_only) {
|
||
|
id = real_ids_only ? uid : euid
|
||
|
if (names_not_groups) {
|
||
|
entry = getpwuid(id)
|
||
|
name = get_first_field(entry)
|
||
|
printf("%s\n", name)
|
||
|
} else {
|
||
|
printf("%u\n", id)
|
||
|
}
|
||
|
|
||
|
exit 0
|
||
|
}
|
||
|
printf("uid=%d", uid)
|
||
|
pw = getpwuid(uid)
|
||
|
print_first_field(pw)
|
||
|
if (euid != uid && ! real_ids_only) {
|
||
|
printf(" euid=%d", euid)
|
||
|
pw = getpwuid(euid)
|
||
|
print_first_field(pw)
|
||
|
}
|
||
|
printf(" gid=%d", gid)
|
||
|
pw = getgrgid(gid)
|
||
|
print_first_field(pw)
|
||
|
|
||
|
if (egid != gid && ! real_ids_only) {
|
||
|
printf(" egid=%d", egid)
|
||
|
pw = getgrgid(egid)
|
||
|
print_first_field(pw)
|
||
|
}
|
||
|
for (i = 1; i in groupset; i++) {
|
||
|
if (i == 1)
|
||
|
printf(" groups=")
|
||
|
group = groupset[i]
|
||
|
printf("%d", group)
|
||
|
pw = getgrgid(group)
|
||
|
print_first_field(pw)
|
||
|
if ((i + 1) in groupset)
|
||
|
printf(",")
|
||
|
}
|
||
|
|
||
|
print ""
|
||
|
}
|
||
|
function get_first_field(str, a)
|
||
|
{
|
||
|
if (str != "") {
|
||
|
split(str, a, ":")
|
||
|
return a[1]
|
||
|
}
|
||
|
}
|
||
|
function print_first_field(str)
|
||
|
{
|
||
|
first = get_first_field(str)
|
||
|
printf("(%s)", first)
|
||
|
}
|
||
|
function fill_info_for_user(user,
|
||
|
pwent, fields, groupnames, grent, groups, i)
|
||
|
{
|
||
|
pwent = getpwnam(user)
|
||
|
if (pwent == "") {
|
||
|
printf("id: '%s': no such user\n", user) > "/dev/stderr"
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
split(pwent, fields, ":")
|
||
|
uid = fields[3] + 0
|
||
|
gid = fields[4] + 0
|
||
|
|
||
|
groupnames = getgruser(user)
|
||
|
split(groupnames, groups, " ")
|
||
|
for (i = 1; i in groups; i++) {
|
||
|
grent = getgrnam(groups[i])
|
||
|
split(grent, fields, ":")
|
||
|
groupset[i] = fields[3] + 0
|
||
|
}
|
||
|
}
|