如何以非 root 用户身份使用 CPAN?

Posted

技术标签:

【中文标题】如何以非 root 用户身份使用 CPAN?【英文标题】:How can I use CPAN as a non-root user? 【发布时间】:2011-02-28 03:32:03 【问题描述】:

我想在我没有 root 访问权限的共享服务器上安装 perl 模块。我怎样才能做到这一点?他们似乎也有旧版本的 CPAN(它在运行命令时抱怨),是否可以在不需要 root 访问权限的情况下从我的帐户更新正在使用的 CPAN 命令?

【问题讨论】:

How can I use a new Perl module without install permissions? 的可能重复项 【参考方案1】:

到目前为止我发现的最简单的方法是说

wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

假设您的配置文件名为 .profile,您可能需要将其更改为 .bash_profile.bashrc 等。之后您可以通过说安装模块

cpanm Module::Name

并像安装在根目录中一样简单地使用它们。


以下是对上述命令作用的简要说明。

wget -O- http://cpanmin.us 获取最新版本的cpanm 并将其打印到STDOUT,然后通过管道传输到perl - -l ~/perl5 App::cpanminus local::lib。第一个- 告诉perl 期望程序在STDIN 上运行,这使得perl 运行我们刚刚下载的cpanm 版本。 perl 将其余参数传递给 cpanm-l ~/perl5 参数告诉cpanm 在哪里安装 Perl 模块,另外两个参数是要安装的两个模块。 [App::cpanmins]1 是安装cpanm 的包。 local::lib 是一个辅助模块,用于管理在本地目录中运行模块所需的环境变量。

安装这些模块后,我们运行

eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`

设置使用本地模块所需的环境变量,然后

echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile

以确保我们下次登录时能够使用它们。

echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

有望使 man 找到本地模块的手册页。

【讨论】:

cpanminus 的 +1... 从未使用过它,所以我觉得我不应该推荐它,但我喜欢它,从我目前看到的 SO 来看 这对我来说效果很好。只需一个小提示,首先删除您的 ~/.profile(或其他)中已经存在的任何现有 PERL5LIB 环境变量。否则 local::lib 在运行第一个命令时将无法安装。 @juannavar 好点,我倾向于将它安装在新安装的机器上,所以我不会遇到这种情况。 使用 wget 代替 curl 的好例子 - 许多系统默认不附带 curl,尽管它们使用 wget,所以这对于没有 root 的人安装新包很有帮助。 @HielkeWalinga 子进程不能修改父进程的环境。为了解决这个问题,需要为父进程设置环境变量的命令如perl -I ~/perl5/lib/perl5 -Mlocal::libssh-agent 会打印出需要在父进程中运行的命令,然后eval 它们。不过,您实际上并不需要eval 他们。你可以说perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands,但 eval 方法更干净(没有文件需要清理或意外覆盖)。【参考方案2】:

http://web.archive.org/web/20120427144232/http://perl.jonallen.info/writing/articles/install-perl-modules-without-root

http://novosial.org/perl/life-with-cpan/non-root/

两组指令的主要步骤都涉及local::lib module

AFAIK,CPAN 逻辑包含在 Perl 模块 (CPAN.pm) 中,这意味着您也可以像安装任何其他 Perl 模块一样轻松地在本地目录中安装较新的逻辑。


此外,一旦您将模块安装在非标准位置,请查看关于从非标准位置加载库的这两个问题(上面的链接中已经提供了一些信息):

How does a Perl program know where to find the file containing Perl module it uses?

How is Perl’s @INC constructed?(又名影响 Perl 模块搜索位置的所有方式有哪些?)

【讨论】:

披露 - 我编写了此答案中链接的两个 SO 问题。 至少有四种不同的方式从 CPAN 安装模块:手动、CPAN 模块(及其命令行等效项cpan)、CPANPLUS 模块(及其命令行等效项cpanp ),以及安装 cpanm 的新 App::cpanminus 发行版。其中,我发现cpanm 是最容易安装和使用的。 cpancpanp 默认安装,但需要大量设置才能正常工作。 404:在此服务器上找不到请求的 URL /writing/articles/install-perl-modules-without-root。【参考方案3】:

为了完整起见,如果您想将perl5 保留在~/Library 下,这是cpanm 在OSX 上的安装过程。

curl -L http://cpanmin.us | perl - -l ~/Library/perl5 App::cpanminus local::lib
eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`
echo 'eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`' >> ~/.bash_profile

【讨论】:

【参考方案4】:

如果您还希望能够阅读 cpanminus 安装模块的手册页,您还应该确保所选库路径的正确子目录位于 MANPATH 中。所以上面显示cpanm安装过程的解决方案需要以下附加命令:

 export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile

【讨论】:

【参考方案5】:

在过去的 6 个月中,我们一直在使用 the following func 进行 20 多次部署,成功地自动部署到 aws ...从主要配置 as follows 调用,这基本上只是上述答案的复制粘贴,但在一个可重复使用的 bash 脚本:

 #! /usr/bin/env bash                                                                                                                                                     │··  
                                                                                                                                                                           │··
  # a bash wrapper for check-installing required perl modules as non-root  
main()                                                                                                                                                                  │··
     doSetVars                                                                                                                                                             │··
     doCheckInstallPreReqs                                                                                                                                                 │··
     perl $PRODUCT_INSTANCE_DIR/src/perl/my-perl-script.t                                                                                                                          │··
                                                                                                                                                                          │··
                                                                                                                                                                           │··
  doSetVars()                                                                                                                                                             │··
     #set -x                                                                                                                                                               │··
     umask 022    ;                                                                                                                                                        │··
     set -u -o pipefail                                                                                                                                                    │··
     run_unit_bash_dir=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0")                                                     │··
     export PRODUCT_INSTANCE_DIR=$run_unit_bash_dir/../..                                                                                                                  │··
                                                                                                                                                                          │··
                                                                                                                                                                           │··
  doCheckInstallPreReqs()                                                                                                                                                 │··
     eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                         │··
     perl -e '                                                                                                                                                             │··
        use JSON ;                                                                                                                                                         │··
        use Data::Printer;                                                                                                                                                 │··
        use Test::Most ;                                                                                                                                                   │··
        use Test::Mojo;                                                                                                                                                    │··
        use Data::Printer ;                                                                                                                                                │··
        use FindBin;                                                                                                                                                       │··
        use JSON::Parse ;                                                                                                                                                  │··
        use IPC::System::Simple ;                                                                                                                                          │··
        use Mojolicious ;                                                                                                                                                  │··
     ' ||                                                                                                                                                                 │··
           curl -L http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib                                                                                         │··
           eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                   │··
           echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.bashrc                                                                                               │··
           cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)                                                                         │··
           export PERL_MM_USE_DEFAULT=1                                                                                                                                    │··
           cpanm JSON Data::Printer Test::Most Test::Mojo Data::Printer FindBin JSON::Parse \                                                                              │··
              IPC::System::Simple                                                                                                                                          │··
           sudo curl -L cpanmin.us | perl - Mojolicious                                                                                                                    │··
                                                                                                                                                                          │··
                                                                                                                                                                           │··
                                                                                                                                                                          │··
                                                                                                                                                                           │··
  main

【讨论】:

以上是关于如何以非 root 用户身份使用 CPAN?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Debian 上以非 root 用户身份运行 Spring Boot 应用程序?

如何在 docker 中以非 root 用户身份写入卷容器?

如何在官方 docker php 映像上以非 root 用户身份运行 composer

以非 root 用户身份运行 Nginx

以非 root 用户身份使用 libusb-1.0 访问 USB 设备

Firefox headless 不能在 Docker 中以非 root 用户身份工作