如何将密码传递给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
我已经找到适合我具体情况的答案:
我只能通过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();