【问题标题】:How can I get name of the user executing my Perl script?如何获取执行我的 Perl 脚本的用户的名称?
【发布时间】:2010-11-25 13:55:35
【问题描述】:

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

当我从 shell 运行它时,我可以轻松地使用 bash 提供的 $ENV{"USER"}。

但显然 - 然后从 cron 运行相同的脚本,也通过 bash - 未定义 $ENV{"USER"}。

当然,我可以:

my $username = getpwuid( $< );

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

【问题讨论】:

    标签: linux perl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      crontab 设置$LOGNAME,所以你可以使用$ENV{"LOGNAME"}$LOGNAME 也是在我的环境中默认设置的(虽然没有查看它的设置位置)所以你可能只能使用$LOGNAME 而不是$USER

      虽然我同意hacker,但不知道getpwuid有什么问题。

      【讨论】:

        【解决方案3】:

        这个看起来更漂亮吗?

        use English qw( −no_match_vars );
        
        my $username = getpwuid $UID;
        

        【讨论】:

        • 嘿。在我的实际代码中,我(当然)使用英语,而且我实际上使用 $REAL_USER_ID,但我不想在这里引发任何“英语与短名称”的争论 :)
        • 在我的代码中我会使用$&lt;,所以这不是我关心的辩论,但我认为你可能会认为它更漂亮。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          例如,getpwuid($不只是用户名,所以如果你想要一个干净的用户名版本,你必须使用 (getpwuid($

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

          my $username = getlogin() || (getpwuid($<))[0] || $ENV{LOGNAME} || $ENV{USER};
          

          【讨论】:

            猜你喜欢
            • 2011-06-03
            • 1970-01-01
            • 1970-01-01
            • 2013-06-26
            • 1970-01-01
            • 2014-03-06
            • 1970-01-01
            • 2017-08-22
            • 2010-09-10
            相关资源
            最近更新 更多