SNMP ロガーから関連行をリアルタイムで取得し、アプリケーション サーバーに移動してチェックしたいと考えています。後半部分は問題なく、scp
うまく機能しています。前半部分は少し困っています。
私がやりたいのは、関連するメッセージについて最新の 3 つのログ ファイルを確認することです。そのため、次のようにします。
[user@SNMPServer]$ cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files
trap.csv trap.csv.2019-05-31_07_00_01 trap.csv.2019-05-31_06_00_01
これは素晴らしいことです。なぜなら、私は次のことを計画しているからです。
[user@SNMPServer]$ grep $ipAddress $files
これも、SNMP サーバーで実行すると正常に動作します。
VMから実行すると、
admin@alarmux:~$sudo ssh [email protected] "cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files"
次のような出力が得られます:
assets bash: testerlog: command not found bash: count.txt: command not found
これらはls -t
、リモート ディレクトリではなく、VM のホーム ディレクトリからの結果です。どこかにエスケープ文字が足りないのでしょうか?
答え1
バッククォートして、$( … )
二重引用符の内側に挿入します。一重引用符を使用すると機能します。
sudo ssh [email protected] 'cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files'
または、xargs を使用してサブシェルを完全に回避します。
sudo ssh [email protected] 'ls -td /var/opt/OV/log/nnm/* | grep -m 3 trap.csv | xargs grep '$ipAddress
答え2
シェルでは、ディレクトリ内でzsh
ファイル名が一致する、最新の変更タイムスタンプを持つ3つのファイルは、パターンで取得されます。*trap.cvs
/var/opt/OV/log/nnm
/var/opt/OV/log/nnm/*trap.cvs(.om[1,3])
は、(...)
前のパターンの動作を変更します。 .
通常のファイルのみ (ディレクトリ名などではない) を選択し、om
変更タイムスタンプの降順で順序付けます。は、[1,3]
最初の 3 つの一致のみを返します (一致が少ない場合は、それより少ない数を返します)。
リモートマシンにシェルがインストールされていればzsh
、次のように実行できます。
ssh [email protected] zsh -c 'grep -wF "$1" /var/opt/OV/log/nnm/*trap.cvs(.om[1,3])' zsh "$ipAddress"
これにより、リモート システム上の最近変更された 3 つのファイルにgrep
保存されている IP アドレスの検索が起動します。$ipAddress
で使用されるフラグにより、grep
正規表現の一致 ( ) ではなく文字列の比較が使用され-F
、一致する文字列が完全な単語 ( -w
; であるため、 は123.123.123.123
と一致しません23.123.123.1
) であることが要求されます。