Как обрабатывать запросы аутентификации с интерактивной клавиатурой в powershell?

Я использую powershell с библиотекой SSH.Net для подключения к серверам ssh и выполнения команд. В основном это работает нормально, за исключением того, что у меня есть система, в которой включена только интерактивная аутентификация с клавиатуры (и я не могу это изменить).

Я нашел ответ, описывающий, как использовать EventHandler в C# для выполнения аутентификации типа интерактивной клавиатуры, но мне не удалось чтобы успешно перенести это на powershell. Похоже, что-то связано с тем, как я обрабатываю событие, но я не уверен, что именно. Любая помощь будет принята с благодарностью!

Когда я пытаюсь запустить приведенный ниже код, я получаю эту ошибку:

Exception calling "Connect" with "0" argument(s): "Value cannot be null.
Parameter name: data"
At C:\Users\nathan\Documents\ssh-interactive-test.ps1:35 char:1
+ $Client.connect()
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

Это соответствующий раздел кода, который я запускаю:

$scriptDir = $(Split-Path $MyInvocation.MyCommand.Path)
[reflection.assembly]::LoadFrom((Resolve-Path "$scriptDir\Renci.SshNet.3.5.dll")) | Out-Null

$ip = "ip address"
$user = "username"
$pass = "password"

$kauth = New-Object Renci.SshNet.KeyboardInteractiveAuthenticationMethod($user)
$pauth = New-Object Renci.SshNet.PasswordAuthenticationMethod($user, $pass)
$action = { 
    foreach ($prompt in $event.SourceEventArgs.Prompts) {
        if ($prompt.Request -like 'Password:*') {
            $prompt.Response = $pass
        }
    }
}
$oe = Register-ObjectEvent -InputObject $kauth -EventName AuthenticationPrompt -Action $action
$connectionInfo = New-Object Renci.SshNet.ConnectionInfo($ip, 22, $user, $pauth, $kauth)
$Client = New-Object Renci.SshNet.SshClient($connectionInfo)
$Client.connect()

Спасибо за прочтение!


person Nathan Coad    schedule 01.03.2017    source источник
comment
Судя по ошибке, похоже, что метод подключения ожидает входных данных, называемых данными, которые вам нужно поместить в скобки. Предложите просмотреть документацию по этому методу, чтобы выяснить, каким должен быть тип/контент «данных».   -  person Mark Wragg    schedule 01.03.2017
comment
Это была одна из моих мыслей, однако рабочий код C#, с которым я связался, не имеет таких входных данных, называемых данными.   -  person Nathan Coad    schedule 02.03.2017


Ответы (1)


этот интерактивный вход с клавиатуры будет работать для вас в PowerShell. Идеи, взятые из примера кода C# от Renci.SshNet. Ниже будет запущен пример команды и получен вывод каждой строки:

$scriptDir = $(Split-Path $MyInvocation.MyCommand.Path)
$ip = "ip address"
$user = "username"
$pass = "password"
$port = 22
Add-Type -Path "$scriptDir\Renci.SshNet.dll"

$action = {
    param([System.Object]$sender, [Renci.SshNet.Common.AuthenticationPromptEventArgs]$e)
    foreach ($prompt in $e.Prompts) {
        if ($prompt.Request.tolower() -like '*password:*') {
            prompt.Response = $pass;
        }
    }
}
$connectionInfo = [Renci.SshNet.KeyboardInteractiveConnectionInfo]::new($ip, $port, $user);
$oe = Register-ObjectEvent -InputObject $connectionInfo -EventName AuthenticationPrompt -Action $action
[Renci.SshNet.SshClient]$client = [Renci.SshNet.SshClient]::new($ip, $port, $user,$pass);
$client.Connect();
[Renci.SshNet.ShellStream]$shellStream = $client.CreateShellStream("dumb", 80, 24, 800, 600, 1024);
$shellStream.WriteLine("ps ax");
$result = $shellStream.ReadLine([System.TimeSpan]::FromMilliseconds(200));
while($result -ne $null) {
    Write-Host $result;
    if($result.Length -gt 1) {
        $result = $shellStream.ReadLine([System.TimeSpan]::FromMilliseconds(200));
    }
}
$client.Disconnect();
person Iggy Zofrin    schedule 24.05.2017