Расположение модулей Centos 8 Perl

Я только что установил Centos 8 на свой сервер, чтобы перенести все с Centos 7 на Centos 8. Я использую множество пользовательских сценариев Perl CGI, которые используются с веб-сервером (Apache). Эти сценарии имеют много модулей .pm, которые они используют. Для включения модулей из файлов скриптов .cgi используется 'use'. Например:

/cgi-bin/somescript.cgi

#!/usr/bin/perl
use some_module;

В приведенном выше примере файл some_module.pm находится внутри /cgi-bin, но когда я пытаюсь запустить http://192.168.0.1/cgi-bin/somescript.cgi возникает следующая ошибка: Не удается найти файл some_module.pm в @INC

Раньше это работало безупречно в Centos 7, но не в Centos 8. Как мне заставить Perl искать в текущем каталоге модули, как это было в более ранних версиях Centos, когда исполнялись файлы сценариев .cgi?


person gpwr    schedule 03.12.2020    source источник
comment
masteringperl .org/2017/01/   -  person choroba    schedule 03.12.2020


Ответы (2)


Centos 7 включает Perl 5.16.3. Centos 8 включает Perl 5.26.3. Это разница пяти основных версий (5.18, 5.20, 5.22, 5.24 и 5.26). Прежде чем делать такой большой скачок в версиях, будет разумно прочитать соответствующие страницы руководства perldelta.

В perl5260delta, вы найдете это:

Удаление текущего каталога (.) из @INC

Двоичный файл Perl включает набор путей по умолчанию в @INC. Исторически он также включал текущий каталог (.) в качестве последней записи, если только он не запускался с включенным режимом taint (perl -T). Хотя это удобно, это имеет последствия для безопасности: например, когда скрипт пытается загрузить дополнительный модуль, когда его текущий каталог не является доверенным (например, /tmp), он может загрузить и выполнить код из этого каталога.

Начиная с версии 5.26, . всегда удаляется по умолчанию, а не только при заражении. Это имеет серьезные последствия для установки модулей и выполнения скриптов.

Итак, обновившись до этой версии, вы сломали свой код.

Простое (но опрометчивое) исправление, которое возвращает предыдущее поведение, состоит в том, чтобы добавить это в начало вашего файла (до того, как он попытается загрузить библиотеки):

use lib '.';

Однако это не рекомендуется, так как это прерывается, когда ваш код не запускается из каталога, содержащего ваш код. Лучшее решение всегда заключалось в том, чтобы добавить путь к библиотеке относительно каталога, содержащего основную программу. Это может выглядеть так:

use FindBin '$RealBin';
use lib $RealBin;
person Dave Cross    schedule 03.12.2020

Как указал @choroba в своем комментарии, . больше нет в списке путей по умолчанию в @INC. Вы можете добавить путь к библиотеке с помощью use lib:

use lib '/cgi-bin';

or

use lib '/var/www/cgi-bin';

(в зависимости от того, что более точно отражает местоположение ваших библиотек.)

person Jim Davis    schedule 03.12.2020