installation_xx_int_${type}_*log
「」形式のファイルを検索しようとしています。現在の日付リモートサーバー内で次のコマンドを使用します。
ssh user@hostname 'file=$(find ~ -type f -name "installation_xx_int_${type}_*log" -mtime -1 -exec basename "{}" \;); cat "$file"' > ~/$file
しかし、ここで問題は変数です。${タイプ}そして$ファイルsshコマンド内では拡張されないため、ファイル出力をリモートサーバーからマイサーバーにリダイレクトできません。
これをより簡単に達成できる他の方法があれば教えてください!
よろしくお願いします!
答え1
シェル変数は魔法のように渡されませんssh
。一部のシステムでは、名前が で始まる場合は環境変数を渡すことができるため、LC_
次のことができます。AcceptEnv LC_*
sshd_config
LC_type="$type" ssh -o SendEnv=LC_type user@hostname '
file=$(
find ~ -type f -name "installation_xx_int_${LC_type}_*log" -mtime -1 \
-exec basename "{}" \;
)
cat -- "$file"
' > ~/test.log
リモートシェルの構文(リモートシェルがPOSIXに似ている場合は、、)$type
に二重引用符内に特殊文字が含まれていない場合は、ローカルシェルにコード引数で次の拡張子を付けることができます。"
`
$
\
ssh
ssh user@hostname '
file=$(
find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 \
-exec basename "{}" \;
)
cat -- "$file"
' > ~/test.log
この拡張を達成するには、一重引用符(ローカルシェルの場合)を削除し、二重引用符を使用する必要があります。
これらすべてに$type
ワイルドカード(*
、、、、、)が含まれている場合は、パターンを取るsによってワイルドカードとして扱われ、文字通り?
理解するにはワイルドカードをエスケープする必要があります。\
[...]
find
-name
\
これを行うのではなく、デフォルト名を使用する理由は不明です。
ssh user@hostname '
find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 \
-exec cat {} +
' > ~/test.log
あなたの質問の後の編集で明確に説明されているように、リモートファイルの内容をローカルシステム上の同じ名前のファイルに保存するには、次のようにする必要があります(GNUシステムであると仮定しますpax
。star
) )またはlibarchiveを使用してfind
同様の操作を実行しますbsdtar
。
ssh user@hostname '
find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 -print0 |
tar --null -T - -cf - |
gzip -1' | tar --transform='s:.*/::' -zxf -
つまり、アーカイブ形式を使用してファイルパスとコンテンツを保存します(tar
ローカルシステムから--transform
受信した場合はtar
ディレクトリ部分を削除します)。