SSH内で変数を拡張できません。

SSH内で変数を拡張できません。

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システムであると仮定しますpaxstar) )または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ディレクトリ部分を削除します)。

関連情報