Выполнение команды с динамическим списком аргументов - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь написать оболочку для Get-PSSession, которая упрощает SSH для меня, но я сталкиваюсь с проблемой, когда кажется, что ядро ​​powershell не анализирует переключатели в аргументах, передаваемых оператору '&':

$cmd, $args = "dir", ("-Depth", "1", "c:", "d:")
& $cmd $args

$cmd, $args = "dir", @("-Depth", "1", "c:", "d:")
& $cmd $args

$cmd, $args = "dir", ("-Depth:1", "C:", "D:")
& $cmd $args

все жалуются

Get-ChildItem : Cannot find path 'C:\...\-Depth' because it does not exist.

Единственный способ сделать это, кажется, с небезопасным чувством

Invoke-Expression "& $cmd $args"

но теперь я должен убедиться, что все параметры правильно экранированы / указаны / и т.д.

В моем последнем случае число аргументов является переменным:

if ($KeyFilePath) {
    $arglist += ("-KeyFilePath", $KeyFilePath)
}

и т.д.

Есть ли какой-нибудь лучший способ сделать это? Есть ли способ гарантировать, что любые предоставленные пользователем параметры будут правильно указаны / экранированы так, что злоумышленник не сможет просто обойти их, добавив свой собственный символ escape / кавычки? Есть ли способ использовать карту / хэш?

1 Ответ

0 голосов
/ 22 мая 2019

Используйте оператор splat @ как @args.

Ваша функция-обертка будет выглядеть как

function Invoke-MyWrappedCommand {
  & /usr/bin/wrappedcommand -MyCustomArg1 Value @args
}

После этого вы можете использовать псевдоним:

set-alias wrappedcommand invoke-mywrappedcommand

Используйте как обычную команду:

PS> wrappedcommand -myarg2 value2

И последняя команда запустится /usr/bin/wrappedcommand -MyCustomArg1 Value -myarg2 value2

Это дополнительно описано в документации PowerShell about_Splatting .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...