株式会社ラクス  ITエンジニア総合支援サイト スタックアスタリスク フルマネージド専用サーバー エクスユニット
ITエンジニアとして 知る 学ぶ
 
Java
.NET
PHP
プログラミング一般
DataBase
システム/サーバ構築
システム/サーバ運用
技術系一般知識
 
 
>IT技術情報>プログラミング一般>Perl第2回:Perl中級
【連載 】Perl

第2回:Perl中級

 


【 ページ 】 | 1 | 2 | 3 | 4 |


<<前のページへ

2.外部プログラム実行


■system, exec

外部プログラムを実行するために、主に 2 つの関数が用意されています(前章で出てきたパイプは省いています)。system 関数は、プログラムを実行し、そのプログラムの終了ステータスを得て、つづきの Perl スクリプトを実行します。対して exec は Perl スクリプトを終了し、指定された外部プログラムを実行します。

また、backtick 演算子という機構も用意されています。プログラムの実行結果(標準出力への出力)を取得することができます。(system ではプログラムの終了ステータスを取得することができますが、backtick 演算子ではそれができません。)バッククオート(`)で囲まれた内容の変数を展開してからシェルに渡して実行し、出力を返します。

backtick 演算子使用例
 

1: $dir = "/tmp";
2: $str = `/bin/ls -l $dir`;


という形で、ls -l /tmp の結果が $str に格納されます。


▼Java や Linux を体系的に学びましょう!▼
Stack*のラクスが、
新学習方式のカリキュラムを開発しました!
14700円から(*1)、Java や Linux を体系的に学べます!!
(*1 テキスト代のみの税込料金です)




■注意点

system などの外部プログラム関数を使う CGI スクリプトを作る際に注意しなければならない点があります。例えば、フォームから受け取った値の一部が system などに外部プログラムの引数の一部として渡すような場合、簡単に任意のコマンド(rm や cat /etc/passwd などの危険なコマンドでさえ)を発行できてしまいます。

たとえば、$fFilename という変数はフォームから渡される値であるとして、
 

1: $str = system("/bin/ls /tmp/$fFilename");


というようなスクリプトが実行される場合、$fFilename に、「; /bin/rm -rf /」と書けば、シェルに対して、「/bin/ls /tmp/; /bin/rm -rf /」というコマンドが渡されます。「;」 は、コマンドの区切りとして認識されますので、ls も rm も実行されてしまいます。

このような問題を防ぐために、下記のような関数が使われます。この関数は「;」を含む、シェルに対して特別な意味を持つ文字をエスケープして出力します。
 

& ; ` ' \ " | * ? ~ < > ^ ( ) [ ] { } $ \n \r


これらがエスケープすべき文字です。
 

sub shellEsc {
  $_ = shift;
  s/([\&\;\`\'\\\"\|\*\?\~\<\>\^\(\)\[\]\{\}\$\n\r])/\\$1/g;
  return $_;
}
$inputChars = "&;`\'\\\"|*?~<>^()[]{}\$\n\r";
print shellEsc($inputChars);


実行してみると、特殊な文字がエスケープされていることがわかるとおもいます。
この関数を用いて、
 

1: $fFilename = shellEsc($fFilename);
2: $str = system("/bin/ls /tmp/$fFilename");


としてやれば、先ほどのプログラムは(多少)安全になります。


>>次のページへ

【 目次 】
1.ファイル、パイプ
2.外部プログラム実行
3.エンコード/デコード
4.日本語処理

【 関連記事 】
【連載】Perl
第1回:Perl基本
第2回:Perl中級
第3回:Perl応用
第4回:Perlその他



サイト内全文検索
スタックアスタリスクのサイトを検索します。検索には、Googleを利用しています。そのため、最新の情報で検索されない可能性があります。


簡単レンタルメールフォーム
300メガ1000円〜 XBitのレンタルサーバー
500メガ1995円〜 電話サポート/PostgreSQL/専用SSLなどにも対応!お客様のニーズを網羅したレンタルサーバ
ホームページ制作のアシストウェブ
STACK* 執筆の講師陣から習得する!! ITエンジニアスクール アイティブースト
統合メールサポートシステム 〜MailDealer(メールディーラー)〜
システム開発,IT教育 〜株式会社アイティーブースト(ITBoost)〜
簡単 営業支援/顧客管理ツール Easy Sales
  利用規約 お問い合わせ・ご意見 スタックアスタリスクについて 運営会社について 
  レンタルサーバー ホスティング 専用サーバー メールフォーム ショッピングカート メール共有 ITエンジニア派遣 Linux講座 Java講座 メール配信 レンタルサーバー Webデータベース 検索サービス
CopyrightcRAKUS Co.,Ltd. All Rights Reserved.  メール管理・共有 顧客管理(CRM)もできるメール対応サポートシステム JAVA LINUX CISCO 技術者派遣 育成事業 株式会社ラクス