如何使用C#启用/禁用Cisco Catalyst 2960中的端口?

时间:2012-02-07 03:34:09

标签: snmp cisco

我是一名刚毕业的学生,​​刚刚在香港担任程序员。如上所述,我需要使用C#来控制Cisco交换机上的端口。

我已经搜索和学习了很长时间,所以我掌握了有关SNMP和MIB的基本知识。我可以找到一些文章谈论如何管理cisco开关,但没有一个指定如何启用和禁用端口。此时我想我需要配置交换机以启用SNMP服务,然后我应该发送SNMP Set数据包来打开/关闭特定端口。这是对的吗?

任何人都有一些经验并喜欢与我分享?请留下一些建议。如果你以前读过一些有用的网站,请留下这里的网址,这样我也可以看看。

非常感谢你的关注。

3 个答案:

答案 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()));
                }
            }

我希望这个答案有用,可以帮助你,