web-dev-qa-db-ja.com

plinkを介してPowerShellからawkコマンドを適切にエスケープする

後( Powershell:アポストロフィを適切にエスケープする )powershellからのplinkを介してコマンドを実行するときに、これらのエスケープを正しく取得する方法がまだわかりません。

私がLinuxホストで実行しようとしているのは

df -k / | tail -1 | awk '{print $4}'

これにより、/での空きKBの量がわかります。

私はPowerShell(Windows)を使用しているため、サーバーにコマンドを取得するにはplinkコマンドを作成する必要があります。素朴に、それはこのように見えます:

& plink -ssh -l $user -batch -pw $pw $user@$IP df -k / | tail -1 | awk '{print $4}'

PowerShellが|にジャンプし、コマンドtailを検索するため、これは失敗します。だから、私はそのようなパイプを脱出する必要があります:

& plink -ssh -l $user -batch -pw $pw $user@$IP df -k / `| tail -1 `| awk '{print $4}'

これでawk: cmd. line:1: Unexpected end of stringが得られます。

PowerShellLinux Bashがそれを変数に置き換えようとするため、$4を2回エスケープする必要があると思います。しかし、どうすればそれを行うことができますか?使用する

\`$4

メッセージは変更されません。

2
Bowi

plink -ssh -l $user -batch -pw $pw $user@$IP "df -k / | tail -1 | awk '{print `$4}'"を使用できます。

一般的にエスケープするPowerShell:

2つの二重引用符の間の文字のエスケープ:

  • $`$でエスケープする必要があります
  • "`"でエスケープする必要があります
  • ```でエスケープする必要があります

例外:
末尾(二重引用符の最後)$はエスケープする必要はまったくありません。

2つの一重引用符の間の文字のエスケープ:

  • '''でエスケープする必要があります

引用符で囲まれていないエスケープ文字:

  • $`$でエスケープする必要があります
  • @`@でエスケープする必要があります
  • #`#でエスケープする必要があります
  • ```でエスケープする必要があります
  • |`|でエスケープする必要があります
  • {}`{`}でエスケープする必要があります
  • ;`;でエスケープする必要があります
  • "`"でエスケープする必要があります
  • '`'でエスケープする必要があります

例外:
末尾(二重引用符の最後)$はエスケープする必要はまったくありません。

特別な常にエスケープされた文字:

  • `0:ヌル文字
  • `a:アラート-キャラクター
  • `b:バックスペース-文字
  • `f:フォーム-フィード-文字
  • `n:改行文字
  • `r:キャリッジリターン-キャラクター
  • `t:水平-タブ-文字
  • `v:垂直-タブ-文字

特殊文字の解析を停止する特別な方法:

  • Powershell 2.0以降、@' ... '@を使用してパラメーターの解釈を防ぐことができますが、@'はコマンドと同じ行にある必要があり、パラメーターは次の行にあり、'@パラメータの後に独自の行にある必要があります
  • Powershell 3.0以降、--%を使用して、--%以降のすべての解析を停止できます。

例:

$h@h#h`h|h{h}h;h"h'h$ :

  • 二重引用符で囲みます:exampleprogram.exe "`$h@h#h``h|h{h}h;h`"h'h$"
  • 一重引用符で囲みます:exampleprogram.exe '$h@h#h`h|h{h}h;h"h''h'$
  • 引用符で囲まれていません:exampleprogram.exe `$h`@h`#h``h`|h`{h`}h`;h`"h`'h$
  • @' ... '@の使用:

exampleprogram.exe @ '
$ h @ h#h`h | h {h} h; h "h'h $
'@

  • --%の使用:exampleprogram.exe --% $h@h#h`h|h{h}h;h"h'h$
1
testeaxeax