Как разрешить некорневым пользователям использовать модули Perl, установленные пользователем root? - PullRequest
0 голосов
/ 11 ноября 2019

Я использую кластер centos7, и я использую root для установки всех необходимых модулей perl, но когда я проверяю, установлены ли perl-модули из учетной записи обычного пользователя, модули не отображаются в качестве пользователя root.

Как можноразрешить некорневым пользователям использовать модули Perl, установленные с помощью root?

Это каталоги, где установлена ​​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

[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 ~]$ 

Ответы [ 2 ]

5 голосов
/ 11 ноября 2019

Я думаю, вы слегка смущены. @INC содержит список каталогов , где Perl будет искать модули. Вы не увидите названия отдельных модулей при печати содержимого @INC. Фактические модули будут установлены в каталогах, перечисленных в ваших выходных данных.

Если вы хотите увидеть, где был установлен модуль, вы можете использовать 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 в качестве пользователя обоих типов и добавьте вывод к своему вопросу.

Другое обновление: Хорошо, глядя на пути, добавленные в вопрос, похоже,Есть несколько версий Perl. В /usr/bin/ есть системный Perl, в /bin/ есть еще один Perl, и похоже, что в /lustre/bio/perl5/bin есть по крайней мере еще один. Вполне может быть и другое.

Каждая установка Perl будет иметь свою собственную библиотеку модулей. И это действительно не очень хорошая идея использовать библиотеку модулей одной установки Perl с другой установкой Perl. Даже если это одна и та же версия Perl, они могли бы быть построены с разными флагами компилятора, которые влияли бы на то, насколько хорошо будут работать скомпилированные модули.

Когда вы устанавливаете модуль Perl из CPAN, он устанавливает его вбиблиотека модулей, связанная с установкой Perl, которую вы используете в данный момент. Похоже, ваш пользователь root устанавливал модули в каталоги библиотек, связанных с системой Perl.

Так что вам нужно выбрать установку Perl, которую вы хотите использовать. Кажется вероятным, что вы хотите использовать системный Perl, так как это тот, который использует пользователь root, и, похоже, тот, на котором установлено большинство модулей. Но кто-то, кто знает больше о том, почему на этой машине установлено несколько установок, может дать вам лучший совет, почему вам следует выбирать между различными установками Perl на машине.

После того, как вы выбрали установку Perlвам нужно убедиться, что ваша переменная $APTH установлена ​​так, чтобы ваша оболочка сначала нашла этот исполняемый файл Perl. И вам нужно установить переменную $PERL5LIB так, чтобы она находила правильную библиотеку модулей для этой установки (хотя стоит отметить, что все установки Perl имеют путь поиска модулей по умолчанию, «записанный» в них по мере их сборки, и если вы неЕсли вы делаете что-то умное, скорее всего, вам вообще не нужно настраивать $PERL5LIB.

В общем, кажется, что ваш сервер был настроен разными людьми на протяжении многих лет, и они 'Мы все установили свою собственную версию Perl по причинам, о которых я могу только догадываться. Лучший вариант - почти наверняка поговорить с людьми, которые больше знают историю этого сервера.

0 голосов
/ 12 ноября 2019

Проблема в том, что RPM perl-homedir устанавливает local :: lib для всех пользователей, включая root, поэтому все модули, установленные как root, устанавливаются в его local :: lib вместо глобальной sitelib, как и ожидалось. Вы можете удалить perl-homedir или исключить пользователя root, как описано в https://bugzilla.redhat.com/show_bug.cgi?id=1709491.

Поскольку установка на sitelib может вызвать проблемы, изменив то, что менеджер пакетов ожидает установить глобально, и модули в любом из sitelibили любой local :: lib будет сломан, когда менеджер пакетов обновится до новой основной версии Perl, вместо этого я предпочитаю установить либо на пользовательский 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 и добавьте этот каталог bin Perl в путь для любых пользователей. которые хотят его использовать - сителиб этого Perl можно настроить без влияния на систему. Это легко сделать с помощью perl-build .

perl-build 5.30.1 /opt/perl-5.30.1
export PATH=/opt/perl-5.30.1/bin:$PATH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...