Multi-Hop SSH出现问题,密码提示为C#

问题描述 投票:-1回答:1

如何将密码传递给SSH提示符,不允许我通过命令发送?

这不起作用

 KeyboardInteractiveAuthenticationMethod DEVICEkauth = new KeyboardInteractiveAuthenticationMethod(DEVICEsshUname);
            PasswordAuthenticationMethod DEVICEpauth = new PasswordAuthenticationMethod(DEVICEsshUname, DEVICEsshPass);

我正在尝试建立多跳ssh连接,由于SSH协议识别,它在第三跳上失败。

Multi hop SSH through SSH.NET in C#不能解决我的问题,它确实帮了我大忙。这个问题试图进行无效的第三跳。

这是通过VeloCloud网关连接到Velo Edge,然后连接到终端设备(DiGi Transport)

到目前为止我所拥有的:

    int sssshTimeOut = 1000;

    KeyboardInteractiveAuthenticationMethod VCGkauth = new KeyboardInteractiveAuthenticationMethod(VCGsshUname);
    PasswordAuthenticationMethod VCGpauth = new PasswordAuthenticationMethod(VCGsshUname, VCGsshPass);

    VCGkauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(VCGHandleKeyEvent);

    SshClient sshVCG = new SshClient(new ConnectionInfo(VCGsshHost, VCGsshPort, VCGsshUname, VCGpauth, VCGkauth));
    if (sssshTimeOut != 0)
    {
        sshVCG.ConnectionInfo.Timeout = TimeSpan.FromSeconds(sssshTimeOut);
    }

    void VCGHandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
    {
        foreach (AuthenticationPrompt prompt in e.Prompts)
        {
            if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
            {
                prompt.Response = VCGsshPass;
            }
        }
    }

    KeyboardInteractiveAuthenticationMethod EDGEkauth = new KeyboardInteractiveAuthenticationMethod(EDGEsshUname);
    PasswordAuthenticationMethod EDGEpauth = new PasswordAuthenticationMethod(EDGEsshUname, EDGEsshPass);

    EDGEkauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(EDGEHandleKeyEvent);
    void EDGEHandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
    {
        foreach (AuthenticationPrompt prompt in e.Prompts)
        {
            if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
            {
                prompt.Response = EDGEsshPass;
            }
        }
    }

    KeyboardInteractiveAuthenticationMethod DEVICEkauth = new KeyboardInteractiveAuthenticationMethod(DEVICEsshUname);
    PasswordAuthenticationMethod DEVICEpauth = new PasswordAuthenticationMethod(DEVICEsshUname, DEVICEsshPass);

    DEVICEkauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(DEVICEHandleKeyEvent);
    void DEVICEHandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
    {
        foreach (AuthenticationPrompt prompt in e.Prompts)
        {
            if (prompt.Request.IndexOf("password:", StringComparison.InvariantCultureIgnoreCase) != -1)
            {
                prompt.Response = DEVICEsshPass;
            }
        }
    }

    Console.WriteLine("Connecting to VCG: "+ VCGsshHost + "");
    sshVCG.Connect();

    Console.WriteLine("Sending ARP command to VCG: " + VCGsshHost + "");
    var commandVCG = sshVCG.CreateCommand("arp -n");
    var resultVCG = commandVCG.Execute();
    Console.WriteLine(resultVCG);

    Console.WriteLine("");
    Console.WriteLine("");
    Console.WriteLine("Forwarding SSH connection to Edge: " + EDGEsshHost + "");
    var portVCG = new ForwardedPortLocal("127.0.0.1", uintVCGsshPort, EDGEsshHost, uintEDGEsshPort);
    sshVCG.AddForwardedPort(portVCG);
    portVCG.Start();
    if (portVCG.IsStarted)
    {
        Console.WriteLine("Forwarding SSH connection to Edge: Started!");
    }
    else
    {
        Console.WriteLine("Forwarding SSH connection to Edge: seems to have failed.....");
    }

    SshClient sshEDGE = new SshClient(new ConnectionInfo(portVCG.BoundHost, (int)portVCG.BoundPort, EDGEsshUname, EDGEpauth, EDGEkauth));
    sshEDGE.Connect();

    Console.WriteLine("Sending ARP command to Edge: " + EDGEsshHost + "");
    var commandEDGE = sshEDGE.CreateCommand("arp -n");
    var resultEDGE = commandEDGE.Execute();
    Console.WriteLine(resultEDGE);

    Console.WriteLine("");
    Console.WriteLine("");
    Console.WriteLine("Forwarding SSH connection to EndDevice: " + DEVICEsshHost + "");
    var portEDGE = new ForwardedPortLocal("127.0.0.1", uintEDGEsshPort, DEVICEsshHost, uintDEVICEsshPort);
    sshEDGE.AddForwardedPort(portEDGE);
    //sshVCG.AddForwardedPort(portEDGE);
    portEDGE.Start();
    if (portEDGE.IsStarted)
    {
        Console.WriteLine("Forwarding SSH connection to End Device: Started!");
    }
    else
    {
        Console.WriteLine("Forwarding SSH connection to End Device: seems to have failed.....");
    }

    SshClient sshDEVICE = new SshClient(new ConnectionInfo(portEDGE.BoundHost, (int)portEDGE.BoundPort, DEVICEsshUname, DEVICEpauth, DEVICEkauth));
    //SshClient sshDEVICE = new SshClient(new ConnectionInfo(portVCG.BoundHost, (int)portVCG.BoundPort, DEVICEsshUname, DEVICEpauth, DEVICEkauth));
    //SshClient sshDEVICE = new SshClient(portEDGE.BoundHost, (int)portEDGE.BoundPort, DEVICEsshUname, DEVICEsshPass);
    sshDEVICE.Connect();

    Console.WriteLine("");
    Console.WriteLine("");
    Console.WriteLine("Sending HW command to End Device: " + DEVICEsshHost + "");
    var commandDEVICE = sshDEVICE.CreateCommand("hw");
    var resultDEVICE = commandDEVICE.Execute();
    Console.WriteLine(resultDEVICE);

我希望SSH连接到VGC,然后连接Edge,然后连接终端设备,并运行命令。

如果我通过Plink进行此过程,将会达到这个目的...

错误:

Renci.SshNet.Common.SshConnectionException:'服务器响应不包含SSH协议标识。'

Plink

Plink Window 1

C:\Users\ncarter>Plink.exe -ssh -L 4000:xxx.xxx.xxx.2:22 [email protected] -P 10444
Using username "xxxxxxx".
[email protected]'s password:
Welcome to Velocloud VCG (GNU/Linux 3.13.0-160-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

Last login: Fri Oct 11 18:44:59 2019 from xxx.xxx.x.42
]0;xxxxxx@xxxx-xxlab: ~xxxxxx@xxxx-xxlab:~$

Plink Window 2

C:\Users\ncarter>Plink.exe -ssh -L 8001:xxx.xxx.xx.1:xxx97 [email protected] -P 4000
Using username "xxxxx".
Using keyboard-interactive authentication.
Password:


BusyBox v1.23.2 (2018-10-19 16:11:09 UTC) built-in shell (ash)

  _    __     __      ________                __
 | |  / /__  / /___  / ____/ /___  __  ______/ /
 | | / / _ \/ / __ \/ /   / / __ \/ / / / __  /
 | |/ /  __/ / /_/ / /___/ / /_/ / /_/ / /_/ /
 |___/\___/_/\____/\____/_/\____/\__,_/\__,_/

                                  VeloCloud Inc.
------------------------------------------------
velocloud Test-Edge-1:~# [6narp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.11.1             ether   00:04:2d:07:b9:1f   C                     ge4
xx.xxx.xxx.227           ether   50:7b:9d:35:1d:12   C                     br-network1
SIP-xxxx.xxx             ether   80:5e:c0:29:61:ad   C                     br-network1
198.19.0.33              ether   00:50:56:91:ff:2e   C                     ge3
198.19.0.1               ether   90:6c:ac:bb:c9:8c   C                     ge3
198.19.0.32              ether   00:50:56:91:7f:da   C                     ge3
xxx.xxx.xx.4             ether   50:7b:9d:35:1d:12   C                     br-network1
velocloud Test-Edge-1:~# [6nssh -p xxx97 [email protected] -t 'hw'
[email protected]'s password:

SN:506143
Welcome. Your access level is SUPER

ss506143>
Serial Number: 506143
HW Rev: 3205b
MAC 0: 00042d07b91f
MAC 1: 00042df7b91f
MAC 2: 00042de7b91f
MAC 3: 00042dd7b91f
MAC 4: 00042dc7b91f
MAC 5: 000000000000
MAC 6: 000000000000
Model: WR11
Part#: WR11-L800-DE1-SU
RAM: 64 MB
OK

ss506143>Connection to 192.168.11.1 closed.
velocloud Test-Edge-1:~# [6n

c# ssh-tunnel ssh.net
1个回答
0
投票

我已经找到适合我具体情况的答案:

我只能通过SSH到VCG(第一个设备),然后通过SSH隧道(转发)到Edge(第二个设备),最后只在Edge上运行SSH命令将命令传递给DiGi(第三台设备),然后听触发器输入密码。

我所做的是创建一个名为'input'的PipeStream,然后启动一个shell使用“输入” PipeStream作为shell到达名为“ shell”的Edge输入。然后,我在桌面上创建了一个名为“ streamWriter”的StreamWriter。“输入” PipeStream。

然后,我将SSH命令发送到sshEDGE shell,并监听了PipeStream上的单词“ password”并输入了所需的密码。

有关while循环的通知,我将每个循环的位置重置为0。

然后我正在听单词“ closed”或指定的超时时间知道何时退出第二个while循环。

然后我StreamRead'输出'并将其分配给我的'ssdeviceResponse'var(reader.ReadToEnd();)。

ssdeviceResponse = "";
uint uintssvcgPort = (uint)(int)ssvcgPort;
uint uintEDGEsshPort = (uint)(int)ssedgePort;
uint uintssdevicePort = (uint)(int)ssdevicePort;
int sssshTimeOut = 1000;

KeyboardInteractiveAuthenticationMethod VCGkauth = new KeyboardInteractiveAuthenticationMethod(ssvcgUN);
PasswordAuthenticationMethod VCGpauth = new PasswordAuthenticationMethod(ssvcgUN, ssvcgPass);

VCGkauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(VCGHandleKeyEvent);

void VCGHandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
{
    foreach (AuthenticationPrompt prompt in e.Prompts)
    {
        if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
        {
            prompt.Response = ssvcgPass;
        }
    }
}

KeyboardInteractiveAuthenticationMethod EDGEkauth = new KeyboardInteractiveAuthenticationMethod(ssedgeUN);
PasswordAuthenticationMethod EDGEpauth = new PasswordAuthenticationMethod(ssedgeUN, ssedgePass);

EDGEkauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(EDGEHandleKeyEvent);
void EDGEHandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
{
    foreach (AuthenticationPrompt prompt in e.Prompts)
    {
        if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
        {
            prompt.Response = ssedgePass;
        }
    }
}

SshClient sshVCG = new SshClient(new ConnectionInfo(ssvcgAddress, ssvcgPort, ssvcgUN, VCGpauth, VCGkauth));
if (sssshTimeOut != 0)
{
    sshVCG.ConnectionInfo.Timeout = TimeSpan.FromSeconds(sssshTimeOut);
}
sshVCG.Connect();

var portVCG = new ForwardedPortLocal("127.0.0.1", ssedgeAddress, uintEDGEsshPort);
sshVCG.AddForwardedPort(portVCG);
portVCG.Start();

SshClient sshEDGE = new SshClient(new ConnectionInfo(portVCG.BoundHost, (int)portVCG.BoundPort, ssedgeUN, EDGEpauth, EDGEkauth));
sshEDGE.Connect();


var input = new PipeStream();
var streamWriter = new StreamWriter(input) { AutoFlush = true };
Stream outPut = new MemoryStream();
var outPutEXT = new MemoryStream();

var shell = sshEDGE.CreateShell(input, outPut, outPutEXT);
shell.Start();

streamWriter.WriteLine("ssh -p " + ssdevicePort + " " + ssdeviceUN + "@" + ssdeviceAddress + " -t '" + ssdeviceCommand + "'");


int Count = 0;
while (input.CanRead)
{
    outPut.Position = 0;
    StreamReader reader1 = new StreamReader(outPut);
    string i = reader1.ReadToEnd();
    if (i.Contains("password"))
    {
        streamWriter.WriteLine(ssdevicePass);
        break;
    }
}


while (input.CanRead)
{
    Count = Count + 1;
    Thread.Sleep(2000); //Added this because the shell would close if I read to fast, weird...
    outPut.Position = 0;
    StreamReader reader1 = new StreamReader(outPut);
    string i = reader1.ReadToEnd();
    if (i.Contains("closed"))
    {
        break;
    }
    else if (Count >= 10)
    {
        //Timeout
        break;
    }
}

outPut.Position = 0;
StreamReader reader = new StreamReader(outPut);
ssdeviceResponse = reader.ReadToEnd();
//Console.WriteLine(ssdeviceResponse);
//Console.WriteLine("!!!END!!!");

streamWriter.Dispose();
reader.Dispose();
outPutEXT.Dispose();
outPut.Dispose();
© www.soinside.com 2019 - 2024. All rights reserved.