簡體   English   中英

如何允許非 root 用戶使用 root 安裝的 Perl 模塊?

[英]How can allow for non root users to use Perl modules that are installed by root?

我正在使用 centos7 集群,我使用 root 安裝所有必需的 perl 模塊,但是當我從普通用戶帳戶中檢查已安裝的 perl 模塊時,沒有列為 root 用戶的模塊。

如何允許非 root 用戶使用 root 安裝的 Perl 模塊?

這是 Perl 安裝的目錄

[root@mu ~]#  perl -e 'print join "\n", @INC'
/root/perl5/lib/perl5/x86_64-linux-thread-multi
/root/perl5/lib/perl5
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5

對於根用戶

[root@mu ~]# which perl
/usr/bin/perl

對於非 root 用戶

[bio@mu ~]$ which perl
/bin/perl

適用於所有用戶的 perl 版本是

[root@mu ~]# perl -v

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi

對於 root 用戶:echo $PATH 和 $PERL5LIB

[root@mu ~]# echo $PATH
/opt/software/edirect:/opt/software/BEASTv1.10.1/bin:/opt/software/genometools-1.5.9/bin:/opt/software/ncbi-blast-2.7.1+/bin:/opt/software/bedtools2/bin:/opt/intel//impi/5.0.2.044/intel64/bin:/opt/intel/composer_xe_2015.1.133/bin/intel64:/opt/intel/composer_xe_2015.1.133/debugger/gdb/intel64_mic/bin:/usr/java/jre1.8.0_151/bin:/usr/java/jre1.8.0_151/bin:/opt/tsce/maui/sbin:/opt/tsce/maui/bin:/opt/tsce/torque6/bin:/opt/tsce/torque6/sbin:/usr/local/bin:/usr/lib64/qt-3.3/bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/ibutils/bin:.:/lustre/shared/software/maker/bin:/root/bin
[root@mu ~]#  
[root@mu ~]# echo $PERL5LIB
/root/perl5/lib/perl5:
[root@mu ~]# 

對於非 root 用戶:echo $PATH 和 $PERL5LIB

[bio@mu ~]$ echo $PATH
/opt/software/edirect:/opt/software/BEASTv1.10.1/bin:/opt/software/genometools-1.5.9/bin:/opt/software/ncbi-blast-2.7.1+/bin:/opt/software/bedtools2/bin:/opt/intel//impi/5.0.2.044/intel64/bin:/opt/intel/composer_xe_2015.1.133/bin/intel64:/opt/intel/composer_xe_2015.1.133/debugger/gdb/intel64_mic/bin:/usr/java/jre1.8.0_151/bin:/usr/java/jre1.8.0_151/bin:/opt/tsce/maui/sbin:/opt/tsce/maui/bin:/opt/tsce/torque6/bin:/opt/tsce/torque6/sbin:/usr/local/bin:/usr/lib64/qt-3.3/bin:/lustre/bio/perl5/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibutils/bin:.:/lustre/shared/software/maker/bin
[bio@mu ~]$ 
[bio@mu ~]$ echo $PERL5LIB
/lustre/bio/perl5/lib/perl5:
[bio@mu ~]$ 

我想你有點困惑。 @INC包含 Perl 將在其中搜索模塊的目錄列表。 打印@INC的內容時,您不會看到各個模塊的名稱。 實際模塊將安裝在 output 中列出的目錄下。

如果要查看模塊的安裝位置,可以使用perldoc -lm

$ perldoc -lm Template
/usr/lib64/perl5/vendor_perl/Template.pm
$ perldoc -lm Time::Piece
/usr/lib64/perl5/Time/Piece.pm

更新:您可以通過運行如下命令獲取安裝在各個@INC目錄中的模塊的完整列表:

$ perl -MFile::Find -E'find sub { say $File::Find::name if -f and /\.pm$/ }, @INC'

更新:perldoc -l更改為(更好的) perldoc -lm

更新:如果用戶和 root 看到的模塊列表之間存在差異,那么最明顯的問題是這兩種類型的用戶運行的是不同版本的 Perl。 嘗試運行which perl作為兩種類型的用戶,並將 output 添加到您的問題中。

另一個更新:好的,查看您添加到問題中的路徑,似乎安裝了幾個版本的 Perl。 /usr/bin/中有系統 Perl , /bin /bin/中有另一個 Perl ,看起來/lustre/bio/perl5/bin中至少還有一個。 可能還有更多。

每次安裝 Perl 都會有自己的模塊庫。 將一個 Perl 安裝的模塊庫與不同的 Perl 安裝一起使用確實不是一個好主意。 即使它們是相同版本的 Perl,那么它們也可能使用不同的編譯器標志構建,這會影響編譯模塊的工作情況。

當您從 CPAN 安裝 Perl 模塊時,它會將其安裝在與您當前使用的 Perl 安裝關聯的模塊庫中。 所以看起來您的 root 用戶已經將模塊安裝到與系統 Perl 關聯的庫目錄中。

因此,您需要選擇要使用的 Perl 安裝。 您似乎很可能想要使用系統 Perl,因為這是 root 用戶正在使用的系統,而且它似乎是安裝了最多模塊的系統。 但是,如果您更了解為什么該機器上有多個安裝,那么您可能會就為什么應該在機器上的各種 Perl 安裝之間進行選擇提供更好的建議。

選擇 Perl 安裝后,您需要確保設置了$APTH變量,以便您的 shell 首先找到 Perl 可執行文件。 而且您需要設置$PERL5LIB變量,以便它為該安裝找到正確的模塊庫(盡管值得指出的是,所有 Perl 安裝都有一個默認的模塊搜索路徑“刻錄到”它們,除非你是做一些聰明的事情,很可能你實際上根本不需要設置$PERL5LIB

總而言之,多年來,您的服務器似乎已由不同的人配置,並且他們都安裝了自己的 Perl 版本,原因我只能猜測。 幾乎可以肯定,最好的選擇是與對該服務器歷史有更多了解的人交談。

問題是 perl-homedir RPM 為所有用戶(包括 root)設置了一個 local::lib,因此以 root 身份安裝的任何模塊都會安裝到它的 local::lib 而不是預期的全局 sitelib。 您可以刪除 perl-homedir,或排除 root 用戶,詳見https://bugzilla.redhat.com/show_bug.cgi?id=1709491

由於安裝到 sitelib 可能會通過更改 package 管理器期望全局安裝的內容而導致問題,並且當 package 管理器更新到新的主要版本 Z01144EFE361A7398F574 時,sitelib 或任何 local::lib 中的模塊將被破壞,我首選的解決方案而是安裝到自定義local::lib (使用cpanm輕松完成),然后將該目錄添加到 PERL5LIB 以供所有希望使用它的用戶使用:

cpanm -l /opt/perllib Foo::Bar
export PERL5LIB=/opt/perllib/lib/perl5:$PERL5LIB
# or to activate it in the current environment so any modules get installed there
eval "$(perl -I/opt/perllib/lib/perl5 -Mlocal::lib=/opt/perllib)"

或者,安裝一個完全獨立的 Perl 並將這個 Perl 的 bin 目錄添加到任何希望使用它的用戶的路徑中 - 然后可以自定義這個 Perl 的 sitelib 而不會影響系統。 這很容易用perl-build完成。

perl-build 5.30.1 /opt/perl-5.30.1
export PATH=/opt/perl-5.30.1/bin:$PATH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM