アイテムが取得した値にメタキャラクタが入るとAlertScriptが動作しない

お世話になっております。いつも参考にさせていただいております。
自己解決できない問題に当たってしまったため投稿させていただきます。
利用しているソフトウェアのバージョンは「ZABBIX 2.0.4」「CentOS 6.4」です。

私が利用している環境ではZABBIXでイベントが発生するとメディアに登録したAlertScriptを利用して、
メールを配信したり、外部のチケット管理システムにイベント情報を送信したりしています。
ほとんどの場合は問題なく動作しているのですが、次の場合に正しく動作せず困っております。

AlertScriptに引数を渡すために、アクションの「件名」や「メッセージ」の項目にて、いくつかのマクロを利用しています。
その中で{ITEM.VALUE}や{ITEM.LASTVALUE}の様にアイテムが取得した値に置換されるマクロを利用しているのですが、
ログ監視などにおいて取得した値にメタキャラクタが入るとAlertScriptが正しく動作しないようです。

原因は、このZABBIX BUGS AND ISSUESの投稿にある、
AlertScriptを呼んだ際にメタキャラクタがエスケープされないことだと思われます。
>Some shell metachars not escaped when call alert script(https://support.zabbix.com/browse/ZBX-4529)

アイテムが取得した値にメタキャラクタが入ってしまった場合でも、AlertScriptを動作させる上手い方法というものはないものでしょうか。

どうぞよろしくお願いします。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

ZABBIX BUGS AND ISSUESに書かれていたというのは、以下の項目で
よろしいでしょうか?

 Some shell metachars not escaped when call alert script
   https://support.zabbix.com/browse/ZBX-4529

確かに、スクリプト呼び出しで、/bin/shの引数として呼び出すよ
うな実装になっているので、そのままではshがメタキャラクタを勝
手に解釈してしまっているのでしょう。

メタキャラクタを取り除いて構わないのであれば、スクリプトを呼
び出す前に、特定のメタキャラクタのみ取り除くという処理を入れ
ることで実現できるかもしれません。

この対処方法は、設定だけでは対処できないので、C言語のソース
を改造することになります。

場所としては、src/zabbix_server/alerter/alerter.c内にある関
数execute_action()でメディアタイプとして、MEDIA_TYPE_EXECで
あった場合の処理のあたりになると思います。

src/libs/zbxexec/execute.cの関数zbx_execute()のあたりでもよ
いかもしれませんが、コマンド文字列ができあがっている状態なの
で、必要なメタキャラクタまで削除してしまわないような注意が必
要だと思われます。

ユーザー fripper の写真

zbxexec/execute.c 内の zbx_execute() は、agent 側での userparameter を利用した
外部コマンド実行や、ExternalCheck 等でも利用されているるようです

パッチを当ててビルドする場合は、そちらへの影響確認や動作チェックも
実施しないと、思わぬ監視動作となる場合がありますので、注意したほうが良いかと思います

ユーザー yanda の写真

TNKさん fripperさん
ご返信ありがとうございます。

>ZABBIX BUGS AND ISSUESに書かれていたというのは、以下の項目でよろしいでしょうか?
失礼しました。その通りです。肝心のURLを貼り忘れてました。
最初の書き込みを修正してURLを追記しました。

>この対処方法は、設定だけでは対処できないので、C言語のソースを改造することになります。
やはり設定変更だけで対処したり、ZABBIXのバージョンを上げるだけで解決する問題じゃないんですよね。

>zbxexec/execute.c 内の zbx_execute() は、agent 側での userparameter を利用した外部コマンド実行や、ExternalCheck 等でも利用されているるようです
ソースを修正したらそのソースが利用されている箇所全てに影響が出ますもんね。
自分でも一度ソースを検索して他に利用されている箇所がないか調べてみます。

ソースの修正しか方法がないならば、その方向で少し頑張ってみようかと思います。
どの辺を修正すべきかのヒントもいただけましたので。

ありがとうございました。