zoukankan      html  css  js  c++  java
  • python中模拟进行ssh命令的执行

    在进行socket编程的时候,可以实现远程执行命令,然后返回相关的结果,但是这种。。。很容易就把服务器搞挂了。


    在这里需要用到commands模块,commands模块中有一个方法为getstatusoutput,主要就是返回执行的返回码和结果,如下所示:

    >>> import commands
    >>> commands.getstatusoutput('ls')
    (0, 'client.py
    server.py')
    >>> commands.getstatusoutput('kel')
    (32512, 'sh: kel: command not found')
    >>> 

    返回的结果是一个元组,第一个为返回码,第一个返回值0表示命令成功执行,其他的表示为未能正确执行;第二个返回值表示返回的结果,如果命令执行失败,那就是返回命令执行的错误信息。


    服务器端代码如下:

    #!/usr/bin/env python
    
    import commands
    import SocketServer
    
    class MyHandler(SocketServer.BaseRequestHandler):
        def handle(self):
            while True:
                data = self.request.recv(1024)
                if not data: break
                cmd = data.strip()
                status,output = commands.getstatusoutput(cmd)
    
                #send the output size
                self.request.sendall(str(len(output)))
    
                #sent the content
                self.request.sendall(output)
    
    HOST = '192.168.1.60'
    PORT = 9999
    
    s = SocketServer.ThreadingTCPServer((HOST,PORT),MyHandler)
    print 'waiting for connection...'
    s.serve_forever()
    在服务器端代码中,在发送的时候,需要发送需要发送的结果的大小,从而发送了两次信息,第一次发送的是文件的大小,第二次发送的是文件的内容。


    客户端代码如下:

    #!/usr/bin/env python
    import socket
    
    s = socket.socket()
    HOST = '192.168.1.60'
    PORT = 9999
    
    def recv_all(s,file_size):
        results = ''
        file_size = int(file_size)
        while file_size > 0:
            if file_size <= 1024:
                data = s.recv(1024)
                results += data
                break
            elif file_size > 1024:
                data = s.recv(1024)
                results += data
                file_size -= 1024
        return results
    
    s.connect((HOST,PORT))
    while True:
        data = raw_input('>>>')
        if not data:break
        if data.strip() == 'exit':
            break
        s.sendall(data)
        if not data:break
        #first time get the size of the file
        file_size = s.recv(1024)
        contens = recv_all(s,file_size)
        print contens
    s.close()
    在进行接收的时候,第一次接收了发过来的文件的大小,然后在进行调用函数recv_all接收所有的文件,在此函数中,主要就是根据缓冲区的大小,将文件进行接收,在这里缓冲区的大小是有设置的,设置为1024,从而每次判断文件的大小,进行接收剩下的文件内容。


    在这里基本实现了ssh的命令执行功能,也就是在服务器端执行相关的命令,然后返回结果。

    主要在进行命令执行的时候,直接使用了commands模块的getstatusoutput方法。

    其实在进行连接ssh时候,python也是可以做到的,密码登录验证,使用paramiko进行连接,好像都是可以直接进行远程操作,不过这也就是socket网络编程的一个功能。




  • 相关阅读:
    感谢燕玲,搞定了客商名称输入即开始检测是否存在
    一步一步学习sqlserverBI多维数据库建立
    sql语句创建文件夹、判断文件夹、创建数据库、表、
    自定义Silverlight DataGrid行列:Defining Columns for a Silverlight DataGrid
    精简版XP SP3安装IIS6,过程坎坷,以此文献给有需要的朋友
    SilverLight 4页面跳转大全(转载)
    如何修改.net framework(转载)
    定义silverlight报表样式Styling a Silverlight Chart
    Silverlight Toolkit DataGrid 单元格内容对齐样式
    一步一步学习sqlserver BI数据仓库设计
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525021.html
Copyright © 2011-2022 走看看