zoukankan      html  css  js  c++  java
  • 利用c#开发一个telnet unix服务器或者防火墙的小工具(转)

    因为工作原因,需要定期从AIX服务器和cisco防火墙统计一些信息,于是决定自己写个小程序利用telnet协议实现这个功能。
    利用SOCKET建立与服务器之间的连接,之后我们就可以利用程序直接发送命令,获得系统性能状况和防火墙流量,然后就可以保存成文件,只需要查看我们的日志文件就可以知道这些数值了。
    在此只描述通过程序telnet AIX服务器的过程,telnet防火墙的过程略过,两者相似,介绍telnet 服务器的过程是因为这里有一些值得我们注意的地方。
    首先我们先与服务器23端口建立一个SOCKET连接:

                IPAddress ipaddr = IPAddress.Parse(firewalladdress);
                IPEndPoint ipep = new IPEndPoint(ipaddr, int.Parse(firewallport));           
                Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                mysocket.Connect(ipep);

    接下来这里有一个问题困扰我很久,最后通过查阅telnet协议才解决,这就是我们在和服务器建立连接之后,服务器会发给我们一堆乱码。因为我们打开cmd窗口,敲入telnet ip port之后,服务器都是直接要求我们输入用户名,然后是密码,所以在此我直接把用户名root发送给服务器,没想到服务器回给我的还是乱码,在查看telnet协议之后,我明白了原来服务器回发给我们的乱码是一些有用的信息,它是在询问我们使用的终端类型,所以我们在建立SOCKET连接之后,应该给服务器发送这样一个包:(如果你也使用的AIX服务器)

                char[] sendfirst = new char[3];
                sendfirst[0] = (char)(255);
                sendfirst[1] = (char)(252);
                sendfirst[2] = (char)(24);
                byte[] sendfirstbytetemp = Encoding.Unicode.GetBytes(sendfirst);
                byte[] sendfirstbyte = new byte[sendfirstbytetemp.Length / 2];
                sendfirstbyte[0] = sendfirstbytetemp[0];
                sendfirstbyte[1] = sendfirstbytetemp[2];
                sendfirstbyte[2] = sendfirstbytetemp[4];
                mysocket.Send(sendfirstbyte, 0, sendfirstbyte.Length, SocketFlags.None);
    注意这里为了获得我需要的字节数组,我构建了两个byte数组,可能如果改变编码方式可以直接得到,但是我没找到用哪种编码方式可以直接得到我想要的字节数组,不管了,先实现了领导叫做的功能再说!!

    在我们把这个字节数组发送给服务器之后,我们就可以接收服务器回给我们的正确的欢迎信息了,就好像我们在cmd窗口看到的那种提示信息,并提示我们输入用户名。此时我们可以把用户名发给服务器:

                byte[] sendusernametemp = Encoding.ASCII.GetBytes(username);
                byte[] sendusername = new byte[sendusernametemp.Length + 2];
                char[] closechar = new char[2];
                closechar[0] = (char)(10);
                closechar[1] = (char)(13);
                byte[] closebyte = Encoding.ASCII.GetBytes(closechar);
                for (int i = 0; i < sendusernametemp.Length; i++)
                {
                    sendusername[i] = sendusernametemp[i];
                }
                sendusername[sendusername.Length - 2] = closebyte[0];
                sendusername[sendusername.Length - 1] = closebyte[1];
                mysocket.Send(sendusername, 0, sendusername.Length, SocketFlags.None);

    注意这里我构建了一个char[] closechar ,这里10,13是我们发送信息的结束标志,之前我没有发送这个标志,直接发送用户名给服务器,而后接收服务器给我的包,收到的信息解码之后竟然就是我发送的用户名,最初以为是我发送信息的编码格式有问题,在这里也走了弯路,查看telnet协议明白了我们需要在发送信息结束之后发给服务器10,13作为结束标志,服务器返回的用户名其实只是我们输入数据的回显。如果大家想要深入了解telnet编程,还是建议大家先了解一些telnet协议,很有帮助。

    好了,继续我们的编程,我们发送完用户名之后,就可以再次接收服务器给我们的信息。

                byte[] recvdatauser = new byte[255];
                mysocket.Receive(recvdatauser, 0, mysocket.Available, SocketFlags.None);
                string recvuserstr = Encoding.ASCII.GetString(recvdatauser);
                recvuserstr = recvuserstr.Substring(username.Length, recvuserstr.Length - username.Length);//没什么用处,我只是去掉了服务器回显的用户名
                recvuserstr = recvuserstr.Trim();
                Console.WriteLine(recvuserstr);

    这时我们接收到的是root's Password:服务器提示我们输入密码,按照上面的例子发送密码给服务器,就可以接收到服务器提示你输入命令的命令提示符了。

    转自:http://www.cnitblog.com/feiyang0721/archive/2008/02/29/31875.html

  • 相关阅读:
    【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
    【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】
    【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
    IMemoryBufferReference and IMemoryBufferByteAccess
    SoftwareBitmap and BitmapEncoder in Windows.Graphics.Imaging Namespace
    Windows UPnP APIs
    编译Android技术总结
    Windows函数转发器
    Two Ways in Delphi to Get IP Address on Android
    Delphi Call getifaddrs and freeifaddrs on Android
  • 原文地址:https://www.cnblogs.com/mossan/p/1095855.html
Copyright © 2011-2022 走看看