码迷,mamicode.com
首页 > 其他好文 > 详细

100 模拟ssh远程执行命令

时间:2019-09-11 20:15:13      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:tde   div   windows   stdout   pipe   就是   https   window   strong   

一、subprocess模块

subprocess 模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。更多查看官网:https://docs.python.org/2/library/subprocess.html?highlight=subprocess#frequently-used-arguments

可以通过subprocess 模块去执行命令

1.1 使用方法

执行命令,把执行的正确结果放到管道中,把执行错误的结果也放到管道中

obj=subprocess.Popen(命令, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

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

# subprocess 执行系统命令的模块
import subprocess
# 把执行的正确结果放到管道中
obj=subprocess.Popen('tasklist',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
#拿到正确结果的管道,读出里面的内容
ss=obj.stdout.read()
err=obj.stderr.read()
print('错误信息',str(err,encoding='gbk'))
#因为windows用的gbk编码,用gbk解码
print(str(ss,encoding='gbk'))

二、模拟实现SSH远程执行命令

服务器

import socket
import subprocess
HOST = "192.168.11.237"
PORT = 8081

soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.bind((HOST,PORT))
soc.listen(5)

while 1:
    print("等待连接。。。")
    conn,addr = soc.accept()
    print("连接成功。。。\n")
    while 1:
        try:
            data = conn.recv(1024)
            if len(data)==0:    # 长度0说明断开了连接。在windows中没用,在linux中才有用
                break

            # 把执行正确的内容放到管道中
            obj = subprocess.Popen(str(data,encoding="utf8"),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            # 执行的结果 b 格式,gbk编码(windows平台)
            suc_msg = obj.stdout.read()
            if suc_msg:
                conn.send(suc_msg)
            else:
                fail_msg = obj.stderr.read()
                conn.send(fail_msg)

        except:
            print("客户机连接中断。。。")
            break
    conn.close()

soc.close()

客户端

import socket
HOST = "192.168.11.237"
PORT = 8081

soc = socket.socket()
soc.connect((HOST,PORT))

while 1:
    try:
        cmd = input("请输入需要执行的命令")
        soc.send(cmd.encode("utf8"))

        data = soc.recv(1024)
        print(data.decode("gbk"))
    except Exception as a:
        print("服务器关闭了:",a)
        break
        
# 4.关闭连接
soc.close()

输入dir命令,由于服务端发送字节少于1024字节,客户端可以接受。

输入tasklist命令,由于服务端发送字节多于1024字节,客户端只接受部分数据,并且当你再次输入dir命令的时候,客户端会接收dir命令的结果,但是会打印上一次的剩余未发送完的数据,这就是粘包问题

100 模拟ssh远程执行命令

标签:tde   div   windows   stdout   pipe   就是   https   window   strong   

原文地址:https://www.cnblogs.com/xichenHome/p/11508239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!