为了在单个会话中使用SSH.NET发送多个命令,您可能需要使用
ShellStream
。这应该将您的2FA批准减少到仅打开到主机的会话。这对于不支持命令通道但支持SSH远程终端(例如您可以putty到它们)的设备(如HPE交换机)以及命令更改(shell)环境并因此需要保持会话打开以完成任务的情况也很有用。否则,SSH命令通道是处理此问题的预期(且更好的)方式。
您可以在
NuDoc - SSH.NET上找到更多SSH.NET文档,而SSH.Net项目的GitHub版本包括
Windows帮助文件。
以下是我编写的一些代码,用于包装
ShellStream
,并保留
StreamReader
和
StreamWriter
,处理从(HP)交换机读取输入并过滤出转义序列,以及读取下一个提示:
public static class SshClientExt {
public static ExtShellStream CreateExtShellStream(this SshClient sc, string termName, uint rows, uint cols, uint width, uint height, int bufSize) =>
new ExtShellStream(sc.CreateShellStream(termName, rows, cols, width, height, bufSize));
}
public class ExtShellStream : IDisposable {
static Regex reEscVT100 = new Regex("\x1B\\[[^A-Z]+[A-Z]", RegexOptions.Compiled);
static TimeSpan ReadTimeout = new TimeSpan(0, 0, 10);
ShellStream ssh;
StreamReader sr;
StreamWriter sw;
public ExtShellStream(ShellStream anSSH) {
ssh = anSSH;
sr = new StreamReader(ssh);
sw = new StreamWriter(ssh);
}
public List<string> ReadLines() {
long prev;
do {
prev = ssh.Length;
Thread.Sleep(250);
} while (ssh.Length != prev);
"-".Repeat(40).Dump();
var ans = new List<string>();
while (true) {
var line = sr.ReadLine();
if (line != null) {
line = line.Remove(reEscVT100).TrimEnd();
$@"""{line}""".Dump();
if (line.EndsWith("#"))
break;
else
ans.Add(line);
}
else
Thread.Sleep(500);
}
return ans;
}
public void DumpLines() => ReadLines();
public List<string> DoCommand(string cmd) {
sw.Write(cmd);
sw.Write("\r");
sw.Flush();
while (!ssh.DataAvailable)
Thread.Sleep(500);
return ReadLines().SkipWhile(l => l == cmd).ToList();
}
#region IDisposable Support
private bool disposedValue = false;
protected virtual void Dispose(bool disposing) {
if (!disposedValue) {
if (disposing) {
ssh.Dispose();
}
disposedValue = true;
}
}
public void Dispose() {
Dispose(true);
}
#endregion
}
下面是一个使用SSH.Net代码实现从交换机中检索配置信息的示例函数:
public static void RetrieveConfigFiles(IDFStack idf) {
using (var sshClient = new SshClient(idf.IPAddress, username, password)) {
sshClient.Connect();
using (var ssh = sshClient.CreateExtShellStream("dumb", 120, 80, 0, 0, 200000)) {
ssh.DumpLines();
ssh.DoCommand("no page");
File.WriteAllLines(idf.ConfigPath, ssh.DoCommand("show running-config structured"));
File.WriteAllLines(idf.StatusPath, ssh.DoCommand("show interfaces brief"));
File.WriteAllLines(idf.LLDPPath, ssh.DoCommand("show lldp info remote-device detail"));
}
sshClient.Disconnect();
}
}
ShellStream
来发送命令。 - NetMageShellStream
不被推荐使用的所有警告,我不愿意去那里。请将其作为答案,并在不久后如果我没有得到其他答案,我会接受它。 - user4843530