メッセージの内容でエスケープが必要な文字は?

【環境】CentOS6.6
     zabbix 2.4.3

いつもお世話になっております。

{ITEM.VALUE1}にセットされた文字列を、Zabbixサーバ内のテキストログファイルに書き出したい
と考えております。({ITEM.VALUE1}にログ文字列がセットされている)

今、問題となっているのが、この{ITEM.VALUE1}にシングルクオートや、括弧()などの制御文字と
なるような文字列がセットされてくるので、アクションの実行内容で以下のようなリモートコマンド
を直接書くと、括弧-> ( などをエスケープ処理してあげないとechoコマンドでシンタックスエラーに
なってしまうことです。

【アクションの実行内容で実装したコマンド】
  echo {ITEM.VALUE1} >> /var/log/zabbix/Text_log.txt
ダブルクオートで囲むと、文字列内にダブルクオートがあると先頭の”と文字列途中の”が対になって
想定どおりの文字列が出力されない。
  echo" {ITEM.VALUE1}" >> /var/log/zabbix/Text_log.txt

しかし、このリモートコマンドをシェルスクリプトとしてメディアに登録することで、以下(1)の
シェルの内容で”ほぼ”何もせずに & \ " ' などのエスケープが必要となりそうな文字列も以下シェルで
問題なくログに書き込みできています。

(1)メディアにテキストログファイルに書き出すシェルスクリプトを登録する。
  【シェルの内容】
   #!/bin/sh
   var=$3
   echo "$var" >> /var/log/zabbix/Text_log.txt

(2)アクションの「デフォルトのメッセージ」に{ITEM.VALUE1}を指定
(3)アクションの実行内容に(1)のシェルを指定したメディアを指定

しかし問題なのがバッククォート「`」が入るとechoコマンドがきちんと出力ができないようで、ログ
に書き込まれません。
バッククォート「`」だけであると判断できれば、これだけ「\`」など置換して対応しようと思います
が、他にメディアでそのまま使えない(エスケープする必要のある)文字がありますでしょうか?

また、メディアに{ITEM.VALUE1}を渡すことで、メディアに$3の引数に渡ってくるまでにエスケープ
処理が行われているのでしょうか?

コメント表示オプション

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

リモートコマンドの呼び出し処理では、メタ文字のエスケープが正
しく処理されませんので、メディアを利用してファイルに出力する
ようにしてください。

ただし、メディアでの処理に関しても、古いバージョンには問題が
あり、

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

で改善が行われているので、2.4系なら2.4.6を利用するようにして
ください。

ユーザー misaki の写真

TNKさん

たいへんありがとうございます。
2.4.6にバージョンアップして確認したいと思います。

メディアの場合、指定したメッセージの文字列が内部でエスケープされて
引数(ここでは$3)にセットされているのですか?
(受取った引数をバイナリで確認しようと考えましたが、簡単な方法が分かりませんで確認出来ていません)

英語が良く分からないのですが・・・ここのようですね(^^ゞ
 >And when this information pass to commandline, shell meta-characters such as '$', '~', '@' and even '`' not escaped.

当方の環境 zabbix 2.4.3 では、 '$', '~', '@' は正しくログに書き込まれ、
バッククオート '`' が入るとechoコマンドが正しく動作しないようです。

ユーザー TNK の写真

メディアの場合、指定したメッセージの文字列が内部でエスケープされて
引数(ここでは$3)にセットされているのですか?

詳細はソースを確認して頂くしかないのですが、メディアスクリプ
トを呼び出す際に、

 ・宛先
 ・件名
 ・メッセージ

の値を引数として、シェルにそのコマンド文字列を実行させる箇所
があります。

ここで、古いバージョンでは、そのコマンド文字列を作成して実行
させる部分に不具合があり、一部のメタキャラクタがシェルによっ
て解釈されてしまって、文字が一部欠損したり、コマンドの行が分
断されてしまって、コマンド自体を実行できなかったり、メッセー
ジの一部しかメディアで登録したスクリプトに引き渡せない場合が
ありました。

例えば、「$」が含まれると、その「$」と直後の文字をつけて、シ
ェル変数だと解釈されてしまったり、「`」があると、次の「`」が
くるまで待ってしまって、結局メッセージ内に「`」が1つしかない
と実行しようとしたコマンドの文字列が途中できれているとシェル
に判断されてスクリプトが実行されません。

先の不具合修正によって、宛先や件名、メッセージ本文などに含ま
れていたメタキャラクタを、シェルに解釈させずにそのままメディ
アスクリプトに引き渡せるように改善されています。

メディアスクリプトに関しては、2.2のマニュアルですが、以下の
URLをご参照ください。
第1引数に宛先、第2引数に件名、第3引数にメッセージが指定され
て呼び出されます。
https://www.zabbix.com/documentation/2.2/jp/manual/config/notifications/...

ユーザー misaki の写真

TNKさん

ありがとうございます。
バージョンアップで確認しようと思ったのですが、客先のシステムですのでバージョンアップの
ハードルが非常に高いようですので、バッククオートをエスケープする処理で対応したいと思っ
ています。
しかしそもそもTNKさんのおっしゃるように、メディアへ渡って来ていない場合は、手の施しよう
がないですね。。。

メディアで受取った引数をバイナリで書き出すbashコマンドか何かあれば確認できると思いますが、
なにかご存知のコマンドなどありましたらご教授頂ければ助かります。

色々調べていますが、なかなか良い方法が見つかりません。

ユーザー TNK の写真

アクションの設定のメッセージの中ではマクロを展開するだけで、
エスケープするように加工することができませんし、古いバージョ
ンでは、そもそもスクリプトの引数として情報を引き渡せないので、
スクリプト側でエスケープすることも不可能です。

アイテムの値として、{ITEM.VALUE1}に入ってくる前で加工できる
のであれば、旧バージョンでも対応できると思います。
つまり、監視しているアイテムの値の元となる文字列を出力するシ
ステムが出力するメッセージやデータを変更できるのであれば、ア
イテムの値として、問題が発生するメタキャラクタを受け取ること
が無いようにして対応することはできるでしょう。
# こちらも対応して頂けないとは思いますが。

メディアで受取った引数をバイナリで書き出すbashコマンドか何かあれば確認できると思いますが、
なにかご存知のコマンドなどありましたらご教授頂ければ助かります。

繰り返しになってしまうと思いますが、そもそもメディアスクリプ
トに引数として値を引き渡せないので、古いバージョンのZabbixで
は、メディアスクリプトをどう工夫しても一部のメタキャラクタを
含む情報をそのままファイルに出力させることはできません。

ユーザー misaki の写真

TNKさん

ありがとうございます。

{ITEM.VALUE1}に '`' バッククオートが入っている場合は、メディアへ{ITEM.VALUE1}の値そのものが
渡って来ないようです。

やはりバージョンアップしかなさそうです。

テストサーバを立てて確認してみます。

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

ユーザー misaki の写真

TNKさん

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

最後にBUG情報の見方を教えてください。

上のサイトでは、以下のバージョンが示されていますが、私の使っているバージョンは2.4.3ですが
影響を受けるバージョンは、1.8.10で、FIXバージョンが以下の通りとなっています。
2.4.3は影響を受けるバージョンとなる見方が分かりません。
どのように見ればいいのでしょうか?

また、現在2.4.7がリリースされていますが、2.4.6との末尾のマイナーバージョン(6or7)でなにか
意味があるのでしょうか?
(例えば偶数バージョンが安定バージョンなど・・)

 Affects Version/s:1.8.10
 Fix Version/s:2.0.15rc1, 2.2.10rc1, 2.4.6rc1, 2.5.0

ユーザー TNK の写真

{ITEM.VALUE1}に '`' バッククオートが入っている場合は、メディアへ{ITEM.VALUE1}の値そのものが
渡って来ないようです。

先にも書かせて頂いた通り、メディアスクリプト自体が実行されて
いないのだと思われます。

最後にBUG情報の見方を教えてください。

基本的には、Fix Versionよりも古いバージョンで問題があります。

Affects Versionに書かれているバージョン以前から問題としてあ
る場合が多いので、Fix Versionで書かれたバージョンよりも前の
バージョンであれば、その不具合がある可能性が高いとご認識され
た方が良いでしょう。

たまに、新機能を追加したときにそれが原因で不具合が発生する場
合があるのですが、そうであるならば、Descriptionの部分に、バ
ージョン○○では発生していなかった、などと以前は発生していな
かったことを報告してくれる場合も多いと思うので、その場合は、
一時的に回避するために、そのバージョンまで戻して対応する場合
もあります。

また、現在2.4.7がリリースされていますが、2.4.6との末尾のマイナーバージョン(6or7)でなにか
意味があるのでしょうか?
(例えば偶数バージョンが安定バージョンなど・・)

2.4.6が2.4系の最新安定バージョンです。
2.4.7はまだリリースされていません。

各リリース時にはリリースノートが公開されますので、何が変わっ
たのかは、リリースノートを確認してください。
英語になってしまいますが、2.4.6のリリースノートは以下のURLに
あります。

http://www.zabbix.com/rn2.4.6.php

2.4.6と2.4.7の「6」と「7」というマイナーバージョンに関しては、
偶数が安定版とかいうのはありません。
大きな数値がより新しい安定しているはずのバージョンです。

2.2.10や2.4.6の頭の部分の「2.2」や「2.4」はメジャーバージョ
ンと呼ばれるもので、これは後ろの数字が偶数であるのが安定版
です。
リリースされているものの中で、2.5.0というのがありましたが、
これは開発版です。
以前も、1.7、1.9、2.1、2.3という後ろの数字が奇数のものがあり
ましたが、これらも開発版です。

開発版ですので、次の安定版を出すまで、次はこんな機能を追加し
ようと思っているとデモ的に紹介するためのものであって、あくま
でもテスト用途でしか利用することはできません。
データベースのテーブルなども変更される可能性があるため、将来
安定版に移行できることも保障されていません。

継続して利用されるのであれば、正式なリリース版をご利用くださ
い。

また、リリースポリシーとして、長期間サポートを行うバージョン
はLTSとしてリリースされています。
現時点の最新のLTSは、2.2です。

2.4は、ポイントリリースというバージョンで、次、3.0が正式に公
開されると1ヶ月でバグ修正が行われなくなったと思いますので、
3.0リリース後は、速やかに3.0へのバージョンアップを行うように
して頂くことになると思います。

http://www.zabbix.com/jp/life_cycle_and_release_policy.php

2.6はリリースされないことになったので、次は3.0がリリースされ
る予定です。
上記URLには8月に3.0がリリースされる予定と書かれていますが、
3.0は現在alpha2という開発中の段階でまだリリースされていませ
ん。

ユーザー misaki の写真

TNKさん

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

Zabbixのダウンロードページにあった2.4.のところにバージョン「7」と「6」がありましたので勘違い
をしていました。
2.4.6.el7を2.4.7だと勘違いしていました。

お忙しいところありがとうございました。