【问题标题】:Why does installing certain CPAN modules require root privilege?为什么安装某些 CPAN 模块需要 root 权限?
【发布时间】:2014-10-30 04:18:16
【问题描述】:

我需要在我没有 root 权限的 linux 机器上安装一些 CPAN 模块。

Spreadsheet::WriteExcel 的安装非常顺利。但是尝试安装File::Find::Rule 失败,并警告“您没有安装到.....的权限”并提示“您可能需要 su 到 root 才能安装包”

我很困惑为什么有些 CPAN 模块安装需要 root 权限,而有些则不需要?如果我真的想在那个 linux 盒子中使用File::Find::Rule,我可以选择任何解决方案吗?

谢谢。

【问题讨论】:

    标签: perl cpan


    【解决方案1】:

    您是否为该用户设置了CPAN 以安装到您控制的目录中?

    如果是这样,那么您可能会在使用 Extutils::MakeMaker(最古老和最常见的构建/安装系统)、Module::Build 和 Module::Install 的模块之间运行。他们都有小怪癖。

    这就是创建local::lib 的原因。一旦你安装并设置了它,你就不必再担心它了(除了那些想要将内容写入特定位置的恶意模块,即使他们被告知不要这样做)。

    【讨论】:

    • 为了说明,构建机制都可以安装到本地目录(您拥有的)而不是系统目录(只读,因为它们影响所有用户)但是使它们安装在新的地方不同。 local::lib 知道如何处理所有这些,并且作为额外的奖励,更新您的 Perl 包含路径。
    • 还有你的可执行路径,这样你就可以找到一些模块(比如 Perl::Tidy)安装的脚本。
    【解决方案2】:

    查看local::lib 以安装到其他位置。

    【讨论】:

      【解决方案3】:

      来自perlfaq8:


      How do I keep my own module/library directory?

      当你构建模块时,告诉 Perl 将模块安装在哪里。

      对于基于 Makefile.PL 的发行版,在生成 Makefile 时使用 INSTALL_BASE 选项:

      perl Makefile.PL INSTALL_BASE=/mydir/perl
      

      您可以在您的 CPAN.pm 配置中进行设置,以便在您使用 CPAN.pm shell 时模块自动安装在您的私有库目录中:

      % cpan
      cpan> o conf makepl_arg INSTALL_BASE=/mydir/perl
      cpan> o conf commit
      

      对于基于 Build.PL 的发行版,使用 --install_base 选项:

      perl Build.PL --install_base /mydir/perl
      

      您也可以将 CPAN.pm 配置为自动使用此选项:

      % cpan
      cpan> o conf mbuild_arg --install_base /mydir/perl
      cpan> o conf commit
      

      【讨论】:

        【解决方案4】:

        您可能没有权限将您的模块安装到像/usr/lib 这样的系统目录。如果你想这样做,你需要以超级用户权限(su 或sudo)运行make install 步骤。

        或者,您可以将 Perl 模块安装到您有权访问的本地目录,而不是安装到默认系统位置。您在生成 makefile 时指定自定义目录。

        来自perlmodinstall:

        gzip -dc yourmodule.tar.gz | tar -xof -
        perl Makefile.PL PREFIX=/my/perl_directory
        make
        make test
        make install
        

        【讨论】:

        • perlmodinstall 是旧的(现在它在我要修复的事情清单上)。使用 INSTALL_BASE 代替 PREFIX。
        • 而且,这是一种工作密集型的方法,因为它不会为您处理依赖关系。只需使用cpan . 从当前目录安装,包括所有依赖项。
        【解决方案5】:

        确实,UNIX 下的某些软件包要求用户是“root”。在安装 Template::Toolkit 时,它触发了 AppConfig,它通过以下方式退出:

          You may have to su to root to install the package
          (Or you may want to run something like
            o conf make_install_make_command 'sudo make'
          to raise your permissions.
        

        Cygwin 不是 UNIX。它只是 Cygwin 的一组 UNIX 实用程序。没有 root 用户,也没有 sudo,也没有办法伪造它。如果您以管理员身份运行 Bash,则不会以某种方式成为 root。 (实际上可能很危险。)

        实际的问题是 /usr/man/man3 没有权限:

         > ls -ls /usr/share/man
        total 1.2M
        384K d--------- 1 spindlea Domain Users 0 Oct 29 18:55 man1/
        768K d--------- 1 spindlea Domain Users 0 Oct 29 18:55 man3/
        8.0K d--------- 1 spindlea Domain Users 0 Oct 29 12:35 man5/
         12K d--------- 1 spindlea Domain Users 0 Oct  6 16:26 man7/
         12K d--------- 1 spindlea Domain Users 0 Oct 29 12:35 man8/
           0 d--------- 1 spindlea Domain Users 0 Oct  6 16:26 mann/
        

        因此无法安装手册页。原因:C:/Cygwin 已从存档中解压缩。在 NTFS 文件系统下,Cygwin 默认在 Windows ACL 上实现 UNIX 权限(尽管您在“安全”选项卡中看不到它们)。这些在 ZIP 存档中无法保存。

        要恢复权限,请使用以下内容:

         > chmod -R 755 /usr/bin        # sets -rwxr-xr-x
         > chmod -R 755 /usr/local/bin  # sets -rwxr-xr-x
         > find /bin  -type d -print -exec chmod 777 {} \;
         > find /etc  -type d -print -exec chmod 777 {} \;
         > find /usr  -type d -print -exec chmod 777 {} \;
             .
             .
        

        问题消失了。安装顺利进行。 CPAN 能够满足所有依赖关系。

        不再出现“您可能需要 su 到 root 才能安装软件包”错误。

        【讨论】:

          【解决方案6】:
          【解决方案7】:

          这是因为某些软件包安装在您的用户无权写入的位置。

          我的建议是让管理员为您安装软件包。我怀疑没有一种简单的方法可以解决这个问题。

          【讨论】:

          • @Gordon : 是否有任何规则指导模块编写者应该在哪里解聚模块,用户是否可以灵活选择模块的安装位置?
          • 抱歉,我没试过。如果由于这个原因它失败了,我只需使用 sudo 安装它
          • 有一些简单的解决方法。这可能就是这个答案被否决的原因。
          猜你喜欢
          • 1970-01-01
          • 2018-02-01
          • 2015-01-26
          • 1970-01-01
          • 2017-05-02
          • 1970-01-01
          • 2020-06-02
          • 2013-08-04
          • 1970-01-01
          相关资源
          最近更新 更多