zoukankan      html  css  js  c++  java
  • 033远程执行命令

    在服务器执行命令
    之前好像缺了执行命令的模块,现在补上

    import  subprocess
    obj = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
    #拿到一个对象,前面是命令,shell设置可以执行脚本,stdout设置一个进程管道,这里实际上是有两个进程,一个是主进程,一个是shell进程
    x = obj.stdout.read()    # 这里拿到执行信息
    print(str(x,'gbk'))  #  str(x,'utf8')忘记系统是gbk编码了
      1. Python中执行系统命令常见的几种方法:  
      2. (1)os.system  
      3. # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息  
      4. # 如果再命令行下执行,结果直接打印出来  
      5. 例如:  
      6. >>> import os  
      7. >>> os.system('ls')  
      8. chk_err_log.py CmdTool.log  install_log.txt  install_zabbix.sh  manage_deploy.sh  MegaSAS.log  
      9.  
      10. (2)os.popen  
      11. #该方法不但执行命令还返回执行后的信息对象  
      12. #好处在于:将返回的结果赋于一变量,便于程序的处理。  
      13. 例如:  
      14. >>> import os  
      15. >>>tmp = os.popen('ls *.sh').readlines()  
      16. >>>tmp  
      17. ['install_zabbix.sh ''manage_deploy.sh ''mysql_setup.sh ''python_manage_deploy.sh ''setup.sh ']  
      18.  
      19. (3)使用模块subprocess  
      20. 使用方法:  
      21. >>> import subprocess  
      22. >>> subprocess.call (["cmd""arg1""arg2"],shell=True)  
      23. 好处在于:运用对线程的控制和监控,将返回的结果赋于一变量,便于程序的处理。  
      24. 如获取返回和输出:  
      25. import subprocess  
      26. p = subprocess.Popen('ls *.sh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)  
      27. print p.stdout.readlines()  
      28. for line in p.stdout.readlines():  
      29.     print line,  
      30. retval = p.wait()  
      31.  
      32. (4)  使用模块commands模块  
      33. 常用的主要有两个方法:getoutput和getstatusoutput  
      34. >>> import commands  
      35. >>> commands.getoutput('ls *.sh')  
      36. 'install_zabbix.sh manage_deploy.sh mysql_setup.sh python_manage_deploy.sh setup.sh' 
      37. >>> commands.getstatusoutput('ls *.sh')  
      38. (0'install_zabbix.sh manage_deploy.sh mysql_setup.sh python_manage_deploy.sh setup.sh')  
      39.  
      40. 注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现错误。 

    以上部分文档来自:http://blog.csdn.net/wangzhaotongalex/article/details/48998299

    ###远程执行命令例子:

    #指令执行结果短的,不会出现问题

     1 import socket
     2 import subprocess
     3 def get_server_socket():
     4     sk = socket.socket()
     5     server_address = ('127.0.0.1',8888)
     6     sk.bind(server_address)
     7     sk.listen(5)
     8     return sk
     9 
    10 def get_conn(sk):
    11     print('waitconnect...')
    12     conn,addr = sk.accept()
    13     return conn
    14 
    15 if __name__ == '__main__':
    16     sk = get_server_socket()
    17     conn = get_conn(sk)
    18     while True:
    19         try:
    20             data = conn.recv(1024)##Linux这里不会报错,如果强行关闭了conn,data就会变成空,也就是说Linux的直接不try就行了。
    21         except Exception as e:
    22             conn = get_conn(sk)
    23         print(str(data,'utf8'))
    24         if not data:
    25             conn = get_conn(sk)
    26             continue
    27         sp = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)#注意命令要是字符串类型
    28         result = sp.stdout.read()#str(sp.stdout.read(),'gbk')
    29         conn.send(result)
    30         print(str(result,'gbk'))
    31         print('waiting...')
    32     conn.close()
    cmd_server.py
     1 import socket
     2 
     3 def connect_server():
     4     sk = socket.socket()
     5     server_address = ('127.0.0.1',8888)
     6     sk.connect(server_address)
     7     return sk
     8 
     9 if __name__ == '__main__':
    10     sk = connect_server()
    11     while True:
    12         inp = input('>>>')
    13         if inp == 'exit':
    14             break
    15         sk.send(bytes(inp,'utf8'))
    16         print('waiting...')
    17         data = sk.recv(1024)
    18         print(str(data,'gbk'))
    19     sk.close()
    cmd_client.py

    #指令执行结果较长,无法一次传递,改进。传送文件的思想。

     1 import  socket
     2 import  subprocess
     3 def  get_server_socket():
     4     sk = socket.socket()
     5     server_address = ('127.0.0.1',8888)
     6     sk.bind(server_address)
     7     sk.listen(5)
     8     return sk
     9 def  get_conn(sk):
    10     print('waitconnect...')
    11     conn, addr = sk.accept()
    12     return conn
    13 
    14 if __name__ == '__main__':
    15     sk = get_server_socket()
    16     conn = get_conn(sk)
    17     while True:
    18         try:
    19             data = conn.recv(1024)##Linux这里不会报错,如果强行关闭了conn,data就会变成空,也就是说Linux的直接不try就行了。
    20         except Exception as e:
    21             conn = get_conn(sk)
    22         print(str(data,'utf8'))
    23         if not data:
    24             conn = get_conn(sk)
    25             continue
    26         sp = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)#注意命令要是字符串类型
    27         result = sp.stdout.read()#读取内容
    28         conn.sendall(bytes(str(len(result)),'utf8'))#发送长度
    29         conn.sendall(result)#发送内容
    30         print(str(result,'gbk'))
    31         print('waiting...')
    32     conn.close()
    cmd_server.py
     1 import socket
     2 def connect_server():
     3     sk = socket.socket()
     4     server_address = ('127.0.0.1',8888)
     5     sk.connect(server_address)
     6     return sk
     7 
     8 if __name__ == '__main__':
     9     sk = connect_server()
    10     while True:
    11         inp = input('>>>')
    12         if inp == '__exit':
    13             break
    14         sk.send(bytes(inp,'utf8'))
    15     print('waiting...')
    16 
    17     result_length = int(str(sk.recv(1024),'utf8'))#记录长度,然后下面接收到相应长度的那内容停止
    18     data = bytes()
    19     while  len(data) != result_length:
    20         r = sk.recv(1024)
    21         data += r
    22     print(str(data,'gbk'))
    23     sk.close()
    cmd_client.py

    ####另外两次连续接收会出现粘包现象

    做个隔断,就是接收方随便发送一个数据,发送方接受后才继续发送,这样子就解决了。

  • 相关阅读:
    Netty ChannelHandler组件作用
    Netty Channel组件作用
    Netty NioEventLoop自定义任务处理
    NIO与BIO
    JDK ByteBuffer与Netty ByteBuf
    linux-源码软件管理-yum配置
    typora使用快捷键
    远程连接mysql库问题
    MVC 后台处理 json格式的日期
    使用 SqlClient 创建数据库连接并获取数据
  • 原文地址:https://www.cnblogs.com/-nbloser/p/8491982.html
Copyright © 2011-2022 走看看