CGI-BBS > CGI > Perl > 関数 system の扱い


カレッヂ
カレッヂ


質問者 ぴらおか  投稿日 11/28(水) 22:50:46
ときどきお世話になります。今回もよろしくお願いします。
cgiにperlを使っていますが、system関数を使ってファイルのコピーをしようとすると
どうもスクリプトが正常に修了しません。
どうやらsystem "cp file_a file_b"という行で死んでいるようですが
ファイルのパーミッション、実行ファイルのsビットなどいろいろやっても
うまくいかないです。
よろしかったらご教授くださいませ。
回答者 らいらい  [削除]  投稿日 12/2(日) 01:27:51
はじめまして、らいらいといいます。>ぴらおかさん

まず、system関数自体が利用できるか確認します。プロバイダー
の提供しているperlバージョンが4だと利用できなかった記憶があります。
BIGLOBEなど、4と5を両方提供しているような環境では、
CGIの1行目の書式を見直してみましょう。

system関数を利用してのファイルのコピーには制限があります。
まず、プロバイダー側でシステムのcpコマンドの利用を許可していることが
大前提です。UNIX系システムではさまざまな手段でコマンドを利用
不可にすることもできます。
また、systemからコマンドを呼び出す際、直接cpと書いても
呼び出せないこともあります。フルパスで/bin/cpと書きましょう。
また、systemコマンドは system(コマンド, 引数1, 引数2, ...)
という書き方もできるので、複雑なコマンドを書くときは利用できるかも
知れません。(利用できないこともあります)

以下のような簡単なCGIで、cpコマンドが利用できるか確認できます。
なお、このCGIを、CGIから書き込みのできるディレクトリに設置し、
設置したディレクトリと同じディレクトリにsample.txtを置いてください。
-------ここから
#!/usr/local/bin/perl5
# 上の行はプロバイダーに合わせて変更してください

my $file1 = './sample.txt';
my $file2 = './test-ok.txt';

if ( -e $file1 ) { system('/bin/cp', $file1, $file2); }

if ( -e $file2 ) { print qq{Content-type:text/html\n\nOK}; }
else {print qq{Content-type:text/html\n\nCannot copy};}

exit;
-------ここまで
BIGLOBEではテキストファイルのコピーが正常に行われました。
バイナリファイルのテストはしていません。
参考になれば幸いです。

返信(回答)する


Web裏技