SSHを使用してリモートサーバーでコマンドを実行することはできません

SSHを使用してリモートサーバーでコマンドを実行することはできません

パターン検索のためにSSHを使用してリモートでgrepコマンドを実行したいと思います。

以下のスクリプトを使用しましたが、動作しません。提案してください。

read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;

答え1

あなたのコード:

read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
  1. おそらくバックスラッシュを正しく読むためにこれを行うread必要があります。read -r -p ... pattern
  2. これを実際のホスト名のプレースホルダとして使用しているか(私の考えでは)これがユーティリティを実行するための値を取得するとhostname思うかどうかはわかりません。hosthostname
  3. 最後の行には、終わらない一重引用符文字列があります。一重引用符で終わっても、一重引用符は$pattern変数を拡張しません。これはcd不要です。変数$host拡張には引用符が必要で、コマンドラインフラグはホスト名の前になければなりません(ただし、-tこの場合はそうではありません)。

提案:

read -r -p "please enter the pattern:" pattern
host=hostname
ssh "$host" find /path -type f -name "'*.gz'" -exec zgrep -e "'$pattern'" /dev/null {} '\;' | grep -F 'Status=completed;'

ここのコマンドは、findリモートホスト上のすべてのファイルを検索し、*.gzそのファイル内のパターンを見つけるために使用されます。結果は最後の結果に基づいてさらに(ローカルに)フィルタリングされます。これが最後のパターンの一部になるべきかどうかはわかりません。そこにいない場合は削除してください。/pathzgrep$patterngrep;

"'*.gz'"スタイリッシュな引用には使用が必要です。"'$pattern'"ローカルシェルは、呼び出し前に最初のレベルの引用符を削除し、リモート側のコマンドにand(値が何でも)をssh残します。'*.gz''...'$patternfind

一致するファイルのファイル名が出力に表示されるように、常に2つ以上のファイル(および他の1つのファイル)を受信して​​いることを確認してくださいzgrep ... /dev/null ...zgrep/dev/null/path

grep -F与えられた文字列を正規表現ではなく固定文字列として扱います。文書化と処理速度を向上させるためにここにあります。

関連情報