一般権限 (非root) で Perl モジュールをインストールする方法 (Red Hat 7.3)

Perl

レンタルサーバを使っていると、Root 権限が与えられていないことが多い。その際、必要な Perl モジュールをインストールしようとしても、Web 上には Root 権限がある前提で書かれた記事が多かったため、役に立たないことが多い。そこで今回は、一般権限ユーザで Perl モジュールをインストールする方法を紹介する。

※ この記事では、Red Hat Enterprise Linux Server release 7.3 (x86_64) 環境 (perl のバージョンは 5.18.2) で試した結果を載せている。

スポンサーリンク

モジュールがない!

そもそもこの記事を書こうと思ったきっかけは、古いサーバから Perl のプログラムを新しいサーバに移したところ、実行時に以下のようなエラーが出たからである。

$ perl hoge.pl
Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at hoge line 6.
BEGIN failed--compilation aborted at hoge.pl line 6.

CGI.pm というモジュール (ある機能を提供するコードの集まり) がライブラリのパス(これは @INC という変数に入っている)から見つからないという意味のエラーである。あるモジュールがインストールされているかは、以下のコマンドでチェックすることができる。

# CGI.pm モジュールの存在チェック
$ perl -MCGI -e 1

このコマンドを実行すると、前述のエラーが表示された。

なお、Perl ではモジュールは PERL5LIB という環境変数を基に検索される(これがない場合は PERLLIB、されには標準のライブラリディレクトリから検索される)。なので、たとえば上の例で言えば /usr/local/lib64/perl5 の下に CGI.pm というファイルがあれば、プログラム中で

use CGI;

と書くことでそれが読み込まれる仕組みとなっている。なので、今回の場合には上記のいずれかのパスに CGI.pm を配置できればいいのだが、非 Root 権限のユーザではそれはできない。そこで、一般ユーザが自由に触れる場所にインストールする必要があるのである。

CPANM とは?

Perl のモジュールは、そのモジュールの最新バージョンのソースコードをダウンロードし、コンパイルしてインストールすることで手動で導入することが可能である。しかし、そのモジュールが別のモジュールに依存している場合、コンパイルができなかったり、インストールしても動作しないということが起こり得る。また、最新バージョンはどれか、あるいはそのソースコードをどこから入手したら良いのかという悩みも発生する。

CPAN とはそのような悩みを解決するために作られたサイトで、様々な Perl モジュールが集められ、公開されている。さらに、CPAN シェルというツールも提供されており、これを使えばあるモジュールのインストールが簡単に行える。しかも、最新バージョンを特定してダウンロードし、それが依存しているモジュールもダウンロードし、すべてをコンパイルしてインストールし、そのモジュールのテストまでの作業を自動で行ってくれる。

しかし、本記事の環境ではそもそも CPAN もインストールされておらず、当然そのコマンドも使用することができなかった。しかし、色々調べると現在では CPANM というツールのほうが、面倒な初期設定も不要で他のモジュールへの依存もなく使いやすいという評判であることが分かった。そこで、これを導入することにした。

CPANM のインストール

それでは、Root 権限を持たない一般権限ユーザで CPANM をインストールしてみよう。これは、CPANM を単体でダウンロードしてそれに実行権限を与えるだけで OK である。

$ curl -LO http://xrl.us/cpanm
$ chmod +x cpanm

cpanm の中を覗いてみれば分かるが、これは1000行あまりの一つの Perl プログラムである。早速、以下のコマンドで CGI.pm のインストールを試みた。

$ ./cpanm CGI.pm
!
! Can't write to /usr/local/share/perl5 and /usr/local/bin: Installing modules to /home/hoge/perl5
! To turn off this warning, you have to do one of the following:
!   - run me as a root or with --sudo option (to install to /usr/local/share/perl5 and /usr/local/bin)
!   - Configure local::lib in your existing shell to set PERL_MM_OPT etc.
!   - Install local::lib by running the following commands
!
!         cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
!
--> Working on CGI
Fetching http://www.cpan.org/authors/id/L/LE/LEEJO/CGI-4.35.tar.gz ... OK
==> Found dependencies: ExtUtils::MakeMaker
--> Working on ExtUtils::MakeMaker
Fetching http://www.cpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.24.tar.gz ... OK
Configuring ExtUtils-MakeMaker-7.24 ... OK
Can't locate ExtUtils/Manifest.pm in @INC (@INC contains: FatPacked::19352456=HASH(0x1274b88) /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./cpanm line 132.

しかし、上記のように ExtUtils/Manifest.pm というモジュールがないと怒られてしまった。そこで以下のようにこれをインストールしようとしてみたのだが、

./cpanm ExtUtils/Manifest.pm
--> Working on ExtUtils::Manifest
Fetching http://www.cpan.org/authors/id/E/ET/ETHER/ExtUtils-Manifest-1.70.tar.gz ... OK
==> Found dependencies: ExtUtils::MakeMaker
--> Working on ExtUtils::MakeMaker
Fetching http://www.cpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.24.tar.gz ... OK
Configuring ExtUtils-MakeMaker-7.24 ... OK
Can't locate ExtUtils/Manifest.pm in @INC (@INC contains: FatPacked::25668488=HASH(0x187ab88) /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./cpanm line 132.

上記のようにまたもや同じエラーが出て、依存関係の堂々巡りになってしまった。Web で調べると、Root 権限で

# yum install perl-ExtUtils-Manifest

とやれば問題ないらしいが、しかし当環境では Root ユーザになることは不可能だった。

ExtUtils/MakeMaker.pm とは?

上記のエラーの原因だが、これは CGI.pm というモジュールが ExtUtils/MakeMaker.pm というモジュールを使って作られているからである。それが存在しないから、エラーになっているのである。では、これをダウンロードして手動でインストール (Makefile.PL から makefile を作成し、make && make install) すれば解決するはずである。

以下のようにコマンドを実行すればよい。

$ wget http://www.cpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.24.tar.gz
$ tar zxvf ExtUtils-MakeMaker-7.24.tar.gz
$ cd ExtUtils-MakeMaker-7.24
$ perl Makefile.PL INSTALL_BASE=~/perl5
$ make
$ make install

これにより ~/perl5/lib/perl5 というディレクトリの下に ExtUtils/MakeMaker.pm というファイルができる(インストールされる)。このパスを使ったのは、cpanm は ~/perl5 以下のディレクトリにモジュールをインストールするからである。

さてインストールしたモジュールを使う(シェルから)ためには、前述の PERL5LIB という環境変数をセットする必要がある。実行パスである PATH も合わせてセットする。~/.bashrc の中に以下のように記述してほしい。

$ vi ~/.bashrc
# 以下の行を追加する
export PATH=$PATH:$HOME/perl5/bin
export PERL5LIB=$PERL5LIB:$HOME/perl5/lib/perl5
# :wq とタイプして保存終了し、このファイルをシェルに読み込ませる。
$ source ~/.bashrc

CGI.pm を CPANM でインストール

では、早速 CPANM で CGI.pm をインストールしてみよう。

./cpanm CGI.pm

これで ~/perl5/lib/perl5 に CGI.pm というモジュールがインストールされ、使えるようになるはずである。

なお、このモジュールを CGI 実行時に使いたい場合は、本来であれば Apache 等の Web サーバの設定を変える必要があるが、一般権限ユーザではそれができないため、スクリプトに次の一行を加える必要がある(hoge は実際のユーザ名)。

use lib '/home/hoge/perl5/lib/perl5';

コメント

タイトルとURLをコピーしました