Как мне получить текущего пользователя в Perl переносимым способом?

Как получить текущего пользователя переносимым способом?

Это похоже на часто задаваемые вопросы, но perlport об этом не говорится, возможно, потому что некоторые странные системы не У вас есть понятие «пользователь»? Однако давайте придерживаться *nix и Windows.

getpwuid($>) не реализован в Windows.

$ENV{USER} || $ENV{USERNAME} кажется привередливым.

http://search.cpan.org не нашел многого.


person Dan Dascalescu    schedule 19.08.2010    source источник
comment
это сценарий CGI или сценарий (приложение сценария)?   -  person vol7ron    schedule 20.08.2010


Ответы (2)


getlogin:

Это реализует одноименную функцию библиотеки C, которая в большинстве систем возвращает текущий логин из /etc/utmp, если он есть. Если ноль, используйте getpwuid.

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

Не рассматривайте getlogin для аутентификации: он не так безопасен, как getpwuid.

Вы также можете попробовать || сделать это с помощью POSIX::cuserid() и Win32::ИмяВхода().

person Ether    schedule 19.08.2010
comment
Если вы переключили пользователей с помощью su, getlogin вернет исходного пользователя, что было бы неприятным сюрпризом для меня как пользователя; просто используйте getpwuid для систем posixy и Win32::LoginName для окон. - person ysth; 20.08.2010
comment
@ysth: приятно знать. Я ожидаю, что это то, на что ссылались документы в разделе «Не учитывать… для аутентификации». - person Ether; 20.08.2010

Win32::LoginName() может использоваться в Windows для получения имени пользователя (без имени домена, поэтому оно может быть неоднозначным):

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

Win32::pwent реализует getpwuid( ) и другие функции для запросов к пользовательской базе данных. К сожалению, его не удалось установить на моем StrawberryPerl 5.12.

person dolmen    schedule 20.08.2010