c# - SSH.Net:更改 IP 地址后执行重启命令超时
问题描述
我正在使用SSH.Net来配置某些设备的 IP 地址。设备需要重新启动才能保存更改的设置。
当我发送重启命令时,设备按预期重启,但执行方法没有返回,而是超时。如果我在不更改 IP 地址的情况下重新启动,该方法将返回并正常完成,因此 IP 地址的更改一定是问题所在。
我尝试将命令添加到队列并按顺序执行它们:
List<string> results = new List<string>();
List<string> commands = new List<string>({"ipaddress 145.43.0.69", "reboot"});
using (SshClient client = new SshClient(IPAddress, sshport, username, password))
{
// Establish connection
client.Connect();
foreach (string command in commands)
{
// Excecute ARP query
SshCommand discover = client.CreateCommand(command);
discover.CommandTimeout = ts;
discover.Execute(); // Timeout occurs here
// Log results
results.Append(discover.Result);
MasterLogger.Instance.LogMessage($"Command ran: {command} for {IPAddress}");
}
client.Disconnect();
}
在发送重启命令之前,我还尝试在更改 IP 地址后断开并重新连接到客户端。这确认在发送重启命令之前 IP 地址没有更改。
有人可以解释为什么会发生这种情况,以及如何解决吗?我怀疑这是因为客户端期望来自旧 IP 地址的响应并且没有得到它,但我不确定如何诊断和修复它。
谢谢!
编辑:设法通过使用 ShellStream 修复它。
using (SshClient client = new SshClient(deviceInfo.IPAddress, sshport, deviceInfo.Username, deviceInfo.Password))
{
client.Connect();
ShellStream shellStream = client.CreateShellStream(string.Empty, 0, 0, 0, 0, 0);
shellStream.WriteLine("reboot");
client.Disconnect();
}
如果有人能解释为什么执行命令不起作用,那就太好了!
解决方案
推荐阅读
- c# - 对于这种观点,这是一个有效的模型吗?
- docker - 如何使用 dns 从主机访问 docker 网络?
- javascript - 从 Javascript 调用 Wicket - ajax 请求未完成
- angularjs - AngularJS ng-if 具有真或假对象值
- java - 如何处理 CompletableFutures 链中的错误响应?
- python - Beautifulsoup 正在从表格中提取四舍五入的小数(可见的),而不是实际的单元格值
- visual-studio - 在 Visual Studio 中组装打印注册表中的值
- chapel - 用于不良内存管理的良好示例教堂代码?
- php - ajax 数据[0] 未定义
- java - Crystal 报表从 XML 创建报表并将其导出为 PDF,而无需原始 XML 的路径