Правильно избежать команды awk от powershell через plink

738
Bowi

После ( Powershell: Правильно избегать апострофов ) я до сих пор не понял, как правильно сделать эти побеги при выполнении команды над plink, исходящей от powershell.

То, что я пытаюсь выполнить на хосте Linux, это

df -k / | tail -1 | awk '' 

Это просто дает мне количество свободных КБ в /.

Так как я нахожусь в своем PowerShell (Windows), я должен построить plinkкоманду, чтобы получить команду на сервер. Наивно это выглядит так:

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

Это терпит неудачу, потому что PowerShell подключается к |и ищет команду tail. Итак, я должен сбежать из труб вот так:

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

Это дает мне awk: cmd. line:1: Unexpected end of string.

Я думаю, мне нужно $4дважды избегать этого, потому что PowerShell и Linux Bash пытаются заменить его переменной. Но как я могу это сделать? С помощью

\`$4 

не меняет сообщение.

2
Попробуйте `` plink -ssh -l $ user -batch -pw $ pw $ user @ $ IP "df -k / | tail -1 | awk '' "` ` testeaxeax 6 лет назад 1
Да, это работает! Если вы отправите это как ответ, я могу принять это. :) Возможно, вы могли бы добавить подсказку о том, что делать, если команда awk также содержит `" `. Bowi 6 лет назад 0

1 ответ на вопрос

1
testeaxeax

Вы можете использовать plink -ssh -l $user -batch -pw $pw $user@$IP "df -k / | tail -1 | awk ''".

Powershell уходит в общем:

Экранирование символов между двумя двойными кавычками:

  • $ нужно сбежать с `$
  • " нужно сбежать с `"
  • ` нужно сбежать с ``

Исключение:
трейлинг (в конце двойной кавычки) $вообще не нужно экранировать.

Экранирование символов между двумя одинарными кавычками:

  • ' нужно сбежать с ''

Экранирующие символы, не заключенные в кавычки:

  • $ нужно сбежать с `$
  • @ нужно сбежать с `@
  • # нужно сбежать с `#
  • ` нужно сбежать с ``
  • | нужно сбежать с `|
  • {и }нужно сбежать с `{и`}
  • ; нужно сбежать с `;
  • " нужно сбежать с `"
  • ' нужно сбежать с `'

Исключение:
трейлинг (в конце двойной кавычки) $вообще не нужно экранировать.

Специальные всегда экранированные символы:

  • `0: Нулевой символ
  • `a: Alert-Character
  • `b: Backspace-Character
  • `f: Form-Feed-Character
  • `n: Символ новой строки
  • `r: Символ возврата каретки
  • `t: Горизонтальный символ табуляции
  • `v: Символ вертикальной табуляции

Специальные способы прекратить разбор специальных символов:

  • Поскольку Powershell 2.0 можно использовать @' ... '@для предотвращения интерпретации ваших параметров, но он @'должен находиться в той же строке, что и ваша команда, параметры должны находиться в следующей строке и '@после отдельной строки параметров.
  • Начиная с Powershell 3.0 вы можете использовать, --%чтобы прекратить разбор всего после--%

Пример:

$h@h#h`h|hh;h"h'h$:

  • Заключено в двойные кавычки: exampleprogram.exe "`$h@h#h``h|hh;h`"h'h$"
  • Заключено в одинарные кавычки: exampleprogram.exe '$h@h#h`h|hh;h"h''h'$
  • Не заключено в кавычки: exampleprogram.exe `$h`@h`#h``h`|h`h`;h`"h`'h$
  • Использование @' ... '@:

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

  • Использование --%:exampleprogram.exe --% $h@h#h`h|hh;h"h'h$
Woooow. :-)) Обязательно добавлю в закладки этот ответ и желаю, чтобы я мог проголосовать не раз. Bowi 6 лет назад 0

Похожие вопросы