ローカル/リモート ls

ローカル/リモート ls

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) であることが要求されます。

関連情報