2
What I need is something like:
$ who-has-uid 1000
cyrus
I know the file /etc/passwd
contains such informations, I'm not asking a script that parses it.
2
What I need is something like:
$ who-has-uid 1000
cyrus
I know the file /etc/passwd
contains such informations, I'm not asking a script that parses it.
4
If you have root access, it's as simple as:
sudo -u \#${pid} whoami
Finally! Thanks, I meant something like that. – cYrus – 2011-12-01T17:33:29.730
2
You could try getent (getent man page):
$ getent passwd 1005
shufler:x:1005:119:shufler,,,:/home/local/shufler:/bin/bash
You could parse out just the username with sed.
1
$ who-has-uid() { perl -e 'print +(getpwuid('$1'))[0], "\n"'; }
$ who-has-uid 0
root
$ who-has-uid 1
daemon
Note that this will work (assuming Perl is configured properly) even if the information comes from somewhere other than the /etc/passwd
file.
There's no real error checking; who-has-uid 999
prints an empty line if there's no such UID on the system.
If you don't insist on a one-liner, you can put this somewhere in your $PATH
:
#!/usr/bin/perl
use strict;
use warnings;
my $ok = 1;
foreach my $uid (@ARGV) {
my @pw = getpwuid $uid;
if (@pw) {
print "$pw[0]\n";
}
else {
warn "$uid: No such user\n";
$ok = 0;
}
}
exit 1 if not $ok;
Thanks but way too complicated outside a Perl context. – cYrus – 2011-12-01T17:32:05.613
@cYrus: Perhaps, but you only have to write it (or copy-and-paste it from here) once. – Keith Thompson – 2011-12-01T18:02:12.440
1
Sure, I understand your point. With "complicated" I mean: unnecessarily complicated. The accepted answer is an example.
– cYrus – 2011-12-01T19:08:26.7831@cYrus: I would say that a simple getpwuid()
or getent
, which is available to all users, is much less complicated than executing a program as the target user via a privileged tool. – user1686 – 2011-12-01T21:45:22.103
@grawity: much less complicated is quite subjective. – cYrus – 2011-12-01T22:29:32.693
0
Use awk, (usually installed GNU awk, gawk) Tell it to use colon as a delimiter, see if field 3 (the UID) is 1000, then print the first field (username)
gawk -F: '$3 == 1000{print $1}' < /etc/passwd
This is if the info is in /etc/passwd, if you have network login info (e.g. on NIS or LDAP) getent works better
getent passwd | gawk -F: '$3 == 1000{print $1}'
You do need single quotes: if you use double quotes, bash will try to figure out what $1 means to the shell, and not pass it to gawk.
This works, but is awfully inefficient with centralized user directories: with 500 users, it'd have to make 499 unnecessary lookups. And that's even assuming the directory supports/allows enumeration, which not all do. – user1686 – 2011-12-01T13:29:39.063
2Why not? Sounds like the easiest solution if you have read access to that file... – Yitzchak – 2011-11-30T22:25:02.277
Because I can't believe there isn't such built-in tool in Debian (e.g.
id -u cyrus
just do the opposite thing). – cYrus – 2011-11-30T22:28:59.007Simple enough to do in a one line bash function: who-has-uid() { grep $1 /etc/passwd| awk -F: '{print $1;}' } – Doug Harris – 2011-11-30T22:38:42.897
who-has-uid 100
will match also100
,1001
, ... I would usegetent passwd 100 | cut -f1 -d:
instead. – cYrus – 2011-11-30T22:45:16.240