レンタルサーバを使っていると、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';
コメント