サーバー上でCGIを使って圧縮ファイルを解凍

CMSなどのサーバーインストール型のソフトは、Zipなどの圧縮ファイルで提供されることが多いです。
このような場合、圧縮ファイルのままサーバーにアップロードして、サーバー側で解凍することをお勧めします。
その際に、解凍を行うCGIを用意すれば便利です。

1.サーバー上で解凍するメリット

サーバーインストール型のソフトをサーバーにアップロードする際に、ローカルで圧縮ファイルを解凍した後、FTPでアップロードしている方は、多いのではないかと思います。
ただ、この方法では、アップロードに非常に時間がかかるというデメリットがあります。
また、場合によってはアップロードが途中で止まってしまい、最初からアップロードをやり直す必要が生じることもあります。
さらに、ファイルをアップロードした後で、ファイルのパーミッションを設定する必要が出ることもあります。

このような問題は、圧縮ファイルをそのままサーバーにアップロードして、サーバー上で解凍すれば、解決することができます。
アップロードの時間を大幅に短縮することができ、また解凍も短時間で行うことができます。
さらに、圧縮ファイルの状況によっては、パーミッションの情報も合わせて解凍されることもあり、パーミッション設定が不要になることもあります。

2.CGIで解凍

サーバー上で解凍するには、通常はSSHでサーバーにログインした上で、コマンドを入力します。
Zipファイルを解凍する場合だと、以下のようなコマンドを入力します。

unzip Zipファイル名

また、gzipファイル(拡張子がtar.gzのファイル)を解凍する場合だと、以下のようなコマンドを入力します。

tar xvzf gzipファイル名

ただ、コマンドを入力するには、いわゆる「黒い画面」を操作することが必要で、抵抗がある方が多いようです。
そこで、このコマンドを実行するようなCGIを、サーバーに設置します。
こうすれば、ブラウザからそのCGIにアクセスすることで解凍を行うことができ、黒い画面を操作する必要はありません。

3.解凍するCGIの内容

Zipファイルを解凍するCGIは、以下のようになります。
3行目の「Zipファイル名」の部分は、実際のZipファイルの名前に置き換えます。

#!/usr/bin/perl -w

my $result = `unzip Zipファイル名`;

print "Content-type: text/html\n\n$result";

また、gzipファイルを解凍するCGIは、以下のようになります。
3行目の「gzipファイル名」の部分は、実際のgzipファイルの名前に置き換えます。

#!/usr/bin/perl -w

my $result = `tar xvzf gzipファイル名`;

print "Content-type: text/html\n\n$result";

CGIには拡張子が.cgiのファイル名を付けて保存し、サーバーにアップロードして、パーミッションを705等に設定します。
また、CGIと同じディレクトリに、解凍したい圧縮ファイルもアップロードします。
この後、ブラウザでCGIにアクセスすれば、CGIと同じディレクトリにファイルが解凍され、解凍した結果(unzipコマンド等の実行結果)が表示されます。

4.注意点

ファイルの解凍が終わったら、元の圧縮ファイルと、解凍用のCGIファイルは、サーバーから削除するようにします。
サーバーに残しておくと、誰かがCGIにアクセスすると圧縮ファイルが再度解凍され、場合によっては不具合を招くこともあり得ます。