2

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

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

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

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

Поскольку я нахожусь в своем 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 .

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

\`$4

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

1 ответ1

1

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

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|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 | ч {ч} ч, ч "Н'Н $
@

  • Использование --%: exampleprogram.exe --% $h@h#h`h|h{h}h;h"h'h$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .