views:

86

answers:

3

How does one get the current user in a portable way? This seems like an FAQ but perlport doesn't speak about it, maybe because some odd systems don't have the concept of "user" to being with? However, let's stick to *nix and Windows.

getpwuid($>) is not implemented on Windows.

$ENV{USER} || $ENV{USERNAME} seems finicky.

http://search.cpan.org didn't turn up much.

A: 

you can't. as you said, some systems have no concept of user.

sreservoir
+5  A: 

getlogin:

This implements the C library function of the same name, which on most systems returns the current login from /etc/utmp, if any. If null, use "getpwuid".

$login = getlogin || getpwuid($<) || "Kilroy";

Do not consider "getlogin" for authentication: it is not as secure as "getpwuid".

You can also try ||-ing this with POSIX::cuserid() and Win32::LoginName().

Ether
If you have switched users with su, getlogin will return the original user, something that would be an unpleasant surprise to me as a user; just use getpwuid for posixy systems and Win32::LoginName for windows.
ysth
@ysth: good to know. I expect this is what the docs were alluding to in "Do not consider..for authentication".
Ether
+1  A: 

Win32::LoginName() can be used on Windows to retrieve the user name (without the domain name, so it may be ambiguous):

use Win32;
my $username = Win32::LoginName;

Win32::pwent implements getpwuid() and other features to query the user database. Unfortunately, it failed to install on my StrawberryPerl 5.12.

dolmen