SSHを使用して変数としてgrep

SSHを使用して変数としてgrep

これら2つの単語を含むファイルをディレクトリから検索したいと思います。ワード1そしてワード2。ローカルディレクトリから検索する場合は、次のコマンドを使用すると正常に動作します。

for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2
 $FILE && echo $FILE; done

リモートホストでは変数を使用できません。どうすればよいですか?別のスレッドで見つけました(SSHによるリモートforループ)人々はこのコマンドを使用してサーバーに接続し、findコマンドを次の引用符で囲みます。これに似ています:

 ssh -l username servername 'for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2 $FILE && echo $FILE; done' 

しかし、これはまだ私には効果がありません。
今実行するコマンドは次のとおりです(まだエラーが発生します)。

ssh username@servername sh -c 'for FILE in /pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'

間違い

FILE: -c: line 0: syntax error near unexpected token `newline'
FILE: -c: line 0: `for'
FILE: Undefined variable

答え1

デフォルトのシェルはtcshリモートホストにあるため、明示的にシェルを起動する必要があるかもしれませんsh

ssh username@servername sh -c 'for FILE in pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'

$FILEまた、外国文字を含むファイル名を処理するには、変数拡張を二重引用符で囲む必要があります。

word1また、およびを使用しても、これは次word2のようになります。grep一般的な表現まさか性格。ファイル内の単語を見つけるにはを使用しますgrep -wF "word"


sshリモートホストで指定されたコマンドを実行するためにログインシェルが常に実行されているようですtcsh本当に大変ですコマンドラインスクリプトから正しい引用符を取得してください。

2つの解決策(どちらも気に入らない):

  1. リモートホストのログインシェルを同じshようなシェルに変更しますbash。ホストシステムにログインして実行します。kshzshchsh

  2. スクリプトファイルにスクリプトを挿入し、ssh次のコマンドで実行します。

    ssh username@servername sh ./script.sh
    

関連情報