如何获取执行 Perl 脚本的用户的名称?

问题描述 投票:0回答:5

我有一个脚本需要知道它是从哪个用户名运行的。

当我从 shell 运行它时,我可以轻松使用 bash 提供的

$ENV{"USER"}

但显然 - 然后从 cron 运行相同的脚本,也通过 bash -

$ENV{"USER"}
未定义。

当然可以:

my $username = getpwuid( $< );

但是看起来不太好 - 有没有更好/更好的方法?它不必独立于系统,因为该脚本仅供我个人使用,并且仅在 Linux 上运行。

linux perl
5个回答
58
投票

尝试从多个地方获取答案,第一个获胜:

my $username = $ENV{LOGNAME} || $ENV{USER} || getpwuid($<);

11
投票

crontab 设置

$LOGNAME
,以便您可以使用
$ENV{"LOGNAME"}
。默认情况下,我的环境中也设置了
$LOGNAME
(虽然没有查看它的设置位置),因此您可能只能使用
$LOGNAME
而不是
$USER

虽然我同意hacker的观点,但不知道哪里出了问题

getpwuid


10
投票

这个看起来更漂亮吗?

use English qw( −no_match_vars );

my $username = getpwuid $UID;

2
投票

抱歉,为什么“看起来不太好”? 这是要使用的适当的系统调用。 如果您想要调用外部程序(例如您也可以从 bash 脚本使用的东西),可以使用 /usr/bin/id 和 /usr/bin/whoami 工具。


1
投票

近年来 Perl 显然发生了很大变化,因为这里给出的一些答案不适用于在现代 Perl 中获取“当前用户名”的干净版本。

例如, getpwuid($

not<) prints a whole bunch of stuff (as a list in list context, or pasted-together as a string in scalar context), 只是用户名,所以你必须使用 (getpwuid($ <))[0] instead if you want a clean version of the username.

另外,我很惊讶没有人提到 getlogin(),尽管这并不总是有效。为了获得真正获得用户名的最佳机会,我建议:

my $username = getlogin() || (getpwuid($<))[0] || $ENV{LOGNAME} || $ENV{USER};
    
© www.soinside.com 2019 - 2024. All rights reserved.