Передача выходных данных в исполняемый файл Windows, запущенный [Diagnostics.Process] :: Start? - PullRequest
0 голосов
/ 09 декабря 2018

Как можно отправить echo y трубу на plink при запуске их с [Diagnostics.Process]::Start

$meProcessID = ([Diagnostics.Process]::Start("echo y | plink.exe", "$($hostName) -l $($uPwd.GetNetworkCredential().Username) -pw $($uPwd.GetNetworkCredential().Password) \`"echo '$($uPwd.GetNetworkCredential().Password)' | sudo -S '/home/someuser/somescript.sh'\`"")).Id

Хотя есть это , на самом деле это не отвечает на мой вопроспоскольку он спрашивает о вызове bash из powershell, а мой - о передаче значения команде Window из стандартного вывода для обхода типа приглашения Host-Read.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Полезный ответ Ансгара Вичерса содержит эффективное решение и разумные предупреждения безопасности.

Использование System.Diagnostics.Process экземпляра с .RedirectStandardInput = $true и использование .StandardInput для обеспечения стандартного ввода после запуска процесса, дает вам больше гибкости, но в вашем случае единственное изменение, которое было необходимо, это передать вашу командную строку как аргумент (2-й параметр),через опцию -c, для программа cmd.exe (1-й параметр) .

  • [Diagnostics.Process]::Start() '* первый параметрэто только имя исполняемого файла / путь , а не полная командная строка.

  • Это 2-й параметр , который принимает строку, содержащую аргументы для передачи в исполняемый файл.

  • Поскольку вы используете функции shell , а именно соединение нескольких команд с pipe , вы должны использовать cmd.exe в качестве исполняемого файла и передавать ваш конвейер в качестве аргумента to cmd.exe /c.

    • Вы также можете использовать powershell.exe, но в этом простом случае достаточно - и быстрее - использовать cmd.exe.

Вот упрощенный пример:

$meProcessID = ([Diagnostics.Process]::Start(
  # Program to launch
  'cmd',
  # Arguments to pass
  '/c echo 42 | powershell -nop -c "''stdin input: '' + $Input" & pause'
).Id

Выше показано, что ввод stdin 42 воспринимается процессом powershell как таковым ($Input);открывается новое окно консоли, в котором отображается следующее:

stdin input: 42
Press any key to continue . . .
0 голосов
/ 09 декабря 2018

Перенаправить STDIN процесса получения.Примерно так:

$username = $uPwd.GetNetworkCredential().Username
$password = $uPwd.GetNetworkCredential().Password

$p = New-Object Diagnostics.Process
$p.StartInfo.FileName = 'plink.exe'
$p.StartInfo.Arguments = $hostName, '-l', $username, '-pw', $password,
    "`"echo '${password}' | sudo -S '/home/someuser/somescript.sh'\`""
$p.StartInfo.RedirectStandardInput = $true
$p.StartInfo.UseShellExecute = $false
$p.Start()

$p.StandardInput.WriteLine('y')

$p.Id  # get the PID

С учетом сказанного я предполагаю, что echo y предназначен для принятия ключа хоста.Это эффективно отключает важный механизм безопасности SSH для противодействия атакам «человек посередине», поэтому я настоятельно рекомендую не делать этого.Лучше проверить ключ хоста SSH удаленного хоста и импортировать его в реестр перед выполнением автоматических подключений.Вы можете подготовить файл .reg с хешем и импортировать его, где это необходимо.Вы также можете использовать аутентификацию с открытым ключом вместо аутентификации по паролю.

Вы были предупреждены.

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