我是一名刚毕业的学生,刚刚在香港担任程序员。如上所述,我需要使用C#来控制Cisco交换机上的端口。
我已经搜索和学习了很长时间,所以我掌握了有关SNMP和MIB的基本知识。我可以找到一些文章谈论如何管理cisco开关,但没有一个指定如何启用和禁用端口。此时我想我需要配置交换机以启用SNMP服务,然后我应该发送SNMP Set数据包来打开/关闭特定端口。这是对的吗?
任何人都有一些经验并喜欢与我分享?请留下一些建议。如果你以前读过一些有用的网站,请留下这里的网址,这样我也可以看看。
非常感谢你的关注。
答案 0 :(得分:7)
我知道三种方法(我最喜欢第一种方法):
选项1:
处理这类事情的常用方法是自动telnet(或自动ssh)发送适当的命令。 IOS在大多数情况下是非常标准化的,并且这种方式运行得很好 - 例如TCL的Expect包非常适合这种事情......我想有一个C#实现。
如果您已熟悉IOS语法,则效果最佳。
选项2:
这可能是你想要的:
IF-MIB :: ifAdminStatus可通过SNMP写入
(这是使用NET-SNMP的示例):
接口UP:
snmpset -v1 -c社区主机名IF-MIB :: ifAdminStatus.interface i 1
接口向下:
snmpset -v1 -c社区主机名IF-MIB :: ifAdminStatus.interface i 2
(其中'interface'是表示接口的数字,该值在同一个MIB中可用 - 在1.3.6.1.2.1.2.2.1.2上行走以查找接口值和描述。)
(同样可能会有一个可以利用的snmpset的C#实现......和 您必须事先在设备上配置SNMP社区。)
选项3:
可以使用SNMP通过TFTP服务器trigger上传或下载配置
有时会按此顺序使用:
1.下载运行配置
2.改变那个配置
3.上传配置
4.将上传的配置复制到正在运行的配置中(覆盖设备上的活动配置)
答案 1 :(得分:1)
我找到了几个POE交换机(cisco和zyxel),snmp字符串操纵POE状态是
的SNMPv2-SMI :: MIB-2.105.1.1.1.3.1.x x为所需端口(对于8端口交换机1~8为24端口交换机1~24)
提到的IF-MIB :: ifAdminStatus.interface仅用于启用/禁用端口 - 但主要目标是重置或降低过夜/周末的电力成本 在具有数十/数百个接入点/ VoIP电话的环境中,这可以节省大量能源
停止端口POE的命令是
snmpset -v 2c -c setcomunity host SNMPv2-SMI :: mib-2.105.1.1.1.3.1.x i 2
在端口上启动POE的命令是
snmpset -v 2c -c setcomunity host SNMPv2-SMI :: mib-2.105.1.1.1.3.1.x i 1
如果您使用的是版本3,那么您还需要身份验证
答案 2 :(得分:0)
你可以用这种方式使用telnet程序google“MinimalisticTelnet”并用例子来理解这个解决方案
另一种方法是使用SNMP协议,例如: 注意:对于使用snmp的工作,我得到更改并自定义SnmpSharpNet库,并在我的程序中调用它
using SnmpSharpNet;
然后将此代码写入禁用端口1到6:
Console.WriteLine("Ports Disabler ");
UdpTarget target = new UdpTarget((IPAddress)new IpAddress("192.168.1.200"));
Pdu pdu = new Pdu(PduType.Set);
pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.1"), new Integer32(2));
pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.2"), new Integer32(2));
pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.3"), new Integer32(2));
pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.4"), new Integer32(2));
pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.5"), new Integer32(2));
pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.6"), new Integer32(2));
AgentParameters aparam = new AgentParameters(SnmpVersion.Ver2, new OctetString("2645"));
SnmpV2Packet response;
try
{
// Send request and wait for response
response = target.Request(pdu, aparam) as SnmpV2Packet;
}
catch (Exception ex)
{
// If exception happens, it will be returned here
Console.WriteLine(String.Format("Request failed with exception: {0}", ex.Message));
target.Close();
return;
}
// Make sure we received a response
if (response == null)
{
Console.WriteLine("Error in sending SNMP request.");
}
else
{
// Check if we received an SNMP error from the agent
if (response.Pdu.ErrorStatus != 0)
{
Console.WriteLine(String.Format("SNMP agent returned ErrorStatus {0} on index {1}",
response.Pdu.ErrorStatus, response.Pdu.ErrorIndex) + response.ToString());
}
else
{
// Everything is ok. Agent will return the new value for the OID we changed
Console.WriteLine(String.Format("Agent response {0}: {1}",
response.Pdu[0].Oid.ToString(), response.Pdu[0].Value.ToString()));
}
}
我希望这个答案有用,可以帮助你,