zoukankan      html  css  js  c++  java
  • day30 模拟ssh远程执行命令

    服务端:

    from socket import *
    import subprocess
    import struct

    server=socket(AF_INET,SOCK_STREAM)
    server.bind(('127.0.0.1',8080))
    server.listen(5)

    while True:
    conn,client_addr=server.accept()
    print('新的客户端',client_addr)

    while True:
    try:
    cmd=conn.recv(1024) #cmd=b'dir'
    if len(cmd) == 0:break

    # 运行系统命令
    obj=subprocess.Popen(cmd.decode('utf-8'),
    shell=True,
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE
    )

    stdout=obj.stdout.read()
    stderr=obj.stderr.read()

    #1、先制作报头(固定长度)
    total_size=len(stdout) + len(stderr)
    header=struct.pack('i',total_size)

    #2、先发送固定长度的报头
    conn.send(header)

    #3、再发送真实的数据
    conn.send(stdout)
    conn.send(stderr)
    except ConnectionResetError:
    break

    conn.close()



    客户端:
    from socket import *
    import struct

    client=socket(AF_INET,SOCK_STREAM)
    client.connect(('127.0.0.1',8080))

    while True:
    cmd=input('>>: ').strip()
    if len(cmd) == 0:continue
    client.send(cmd.encode('utf-8'))

    #1、先收固定长度的报头
    header=client.recv(4)

    #2、从报头中解析出对数据的描述信息
    total_size=struct.unpack('i',header)[0]

    #3、再收真实的数据
    recv_size=0
    res=b''
    while recv_size < total_size :
    data=client.recv(1024)
    res+=data
    recv_size+=len(data)

    print(res.decode('gbk'))

    注意注意注意:

    res=subprocess.Popen(cmd.decode('utf-8'),
    shell=True,
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE)

    的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码

    且只能从管道里读一次结果



  • 相关阅读:
    BFS visit tree
    Kth Largest Element in an Array 解答
    Merge k Sorted Lists 解答
    Median of Two Sorted Arrays 解答
    Maximal Square 解答
    Best Time to Buy and Sell Stock III 解答
    Best Time to Buy and Sell Stock II 解答
    Best Time to Buy and Sell Stock 解答
    Triangle 解答
    Unique Binary Search Trees II 解答
  • 原文地址:https://www.cnblogs.com/fxc-520520/p/9285657.html
Copyright © 2011-2022 走看看