day8-套接字sock 实现SSH远程执行命令功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day8-套接字sock 实现SSH远程执行命令功能相关的知识,希望对你有一定的参考价值。
复习
#面向对象编程
#类:
#对象
#实例化 :从一个类到产生一个对象的过程
#对象 = 类名() #__init__初始化方法,是为了给一个具体的对象放一些初识的属性
#在类中:
# 静态属性 直接定义在类中的属性,使用静态属性:类名、对象名都可以调用
# 动态属性 就是方法 就是定义在类中的函数 默认传一个self
# class Person:
# money = 100
# sister = Person()
# father = Person()
# Person.money += 200
# Person.money += 500
# print(Person.money)
#组合:是什么有什么的关系。
#一个类的对象作为两外一个类的属性来使用
#继承
#子类
#父类、基类、超类
#单继承和多继承
#子类中出现 : 派生 父类中没有的子类中有了
#派生方法
#派生属性
#经典类和新式类在多继承上有什么特点
#新式类广度优先和经典类深度优先
# python2 : 经典类 指名道姓去使用父类的方法
class A:
def func(self):print(‘A‘)
class B(A):
def func(self):
super().func()
# super(B,self).func()
print(‘B‘)
b = B()
b.func()
super(B,b).func() #不常用
多态
#初识面向对象
#继承和组合
#面向对象的进阶
#多态
#封装
#面向对象:反射
#类中的内部的 双下方法
#__init__
#__dict__
#多态:python自带多态
# def func(int a):
# print(a)
# func(2)
# func(‘ashkgask‘)
class Animal:
pass
class Dog(Animal):pass
class Cat(Animal):pass
wangcai = Dog()
kitty = Cat()
def eat(obj):
print(obj.name,‘在吃‘)
eat(1)
eat(‘hello‘)
#多态:在其他语言里:类的继承
#在Python中
#有相同特点的类:鸭子类型
#list 和 tuple 鸭子类型
#1+2 ‘a‘+‘b‘
封装
#封装就是把方法和属性 扔到一个容器里装起来
#私有的:只能在类的内部使用,不能直接在类的外部使用
# class Supermarket:
# __DISCONT = 0.8 #加了双下划线就被定义成了一个私有的
# def __init__(self,org_price):
# self.price = org_price * Supermarket.__DISCONT
# A.__COUNTRY
# a = A()
# a.func()
# print(A.__dict__)
# print(A._A__COUNTRY) #不合法
# class Goods:
# __DISCONT = 0.8 #加了双下划线就被定义成了一个私有的
# def __init__(self,org_price):
# self.price = org_price * Goods.__DISCONT
#
# apple = Goods(10)
# print(apple.price)
# class A:
# def __func(self):
# self.__name = ‘alex‘
#
# a = A()
# a._A__func()
#私有的 __名字
#定义私有静态属性
#定义私有的方法
#定义私有的对象属性
#只要是私有的:类内正常使用,类外不能直接使用。如果一定要用_类名__名字
#私有的东西可以子类中使用么?不能
#用到私有变量
#1.当我们想要隐藏一个变量不被外调用的时候
#2.当我们写在父类中且不希望子类继承的时候
class A:
__B = ‘hahaha‘
class B(A):pass
print(A.__dict__)
print(B.__dict__)
几个类中的装饰器
#property
#classmethod
#staticmethod
# class Circle:
# def __init__(self,r):
# self.r = r
#
# @property
# def area(self):
# return self.r *self.r *3.14
#
# c1 = Circle(5)
# print(c1.area)
class A:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self,new_name):
if type(new_name) is str:
self.__name = new_name
# a = A(‘alex‘)
# print(a.name)
# #希望不从外部被修改 所以设置一个私有的属性
# #但是又希望能从外部查看 所以使用一个property
# a.name = ‘alex_sb‘
# print(a.name)
#classmethod
class A:
country = ‘China‘
def func(self):
self.name= ‘alex‘
@classmethod #类方法:就是不需要传具体的对象
#但是可以使用类的属性、静态属性
def c_method(cls):
print(‘in class method‘)
print(cls.country)
@staticmethod #静态方法
def s_method():print(‘in static method‘)
A.c_method()
A.s_method()
#完全的面向对象编程
#所有的方法代码都必须写类里
#只能把原来的函数写进类里
#而原本又只是函数 所以就加上一个staticmethod装饰器
反射
#issubclass(子类,父类)
# class A:pass
# class B(A):pass
# print(issubclass(B,A))
# isinstance(对象,类名)
#判断一个对象是不是这个类的实例
# b = B()
# print(isinstance(b,B))
# print(isinstance(b,A))
#什么叫反射
#使用字符串的形式去获取变量
# a = 1
# b = 2
# name = input(‘变量名 :‘)
# if name == ‘a‘:
# print(a)
class Person:
role = ‘Person‘
country = ‘China‘
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
print(‘%s in func‘%self.name)
alex = Person(‘alex‘,80)
# name = input(‘属性名 :‘)
# Person.role
# alex.name alex.age
# if hasattr(alex,‘func‘):
# func = getattr(alex,‘func‘)
# func()
def func2(self):
print(‘%s in func2‘ % self.name)
#setattr
# alex.sex = None
# setattr(alex,‘sex‘,‘不详‘)
# print(alex.sex)
# setattr(alex,‘func2‘,func2) #setattr绑定方法是一个假的
# # print(alex.func) # 在使用的时候必须要手动传self对象
# alex.func2(alex)
#delattr
# delattr(alex,‘name‘) #del alex.name
# alex.name
#使用反射来调用类中的方法和属性,对象的属性
# import demo1
# print(demo1.a)
# print(getattr(demo1,‘a‘))
# demo1.qqxing()
# getattr(demo1,‘qqxing‘)()
a = ‘aaaaa‘
import sys
this_module = sys.modules[__name__]
print(getattr(this_module,‘a‘))
#反射:a.b --> getattr(a,‘b‘)
#hasattr getattr setattr delattr
#类,静态属性、类方法
#对象,方法、属性
#模块,函数,变量
#本模块,函数,变量
类中的内置方法
# class A:
# def __call__(self, *args, **kwargs):
# print(‘aaaaaaaa‘)
# a = A()()
#__new__
class A:
def __init__(self): #初始化方法
self.x = 1
print(‘in init function‘)
def __new__(cls, *args, **kwargs): #构造方法
print(‘in new function‘)
return object.__new__(A, *args, **kwargs)
a = A() #先构造一个对象 再初始化属性
#单例模式
#从头到尾只有一个实例
class Singleton:
# def __new__(cls, *args, **kw):
# if not hasattr(cls, ‘_instance‘):
# cls._instance = object.__new__(A, *args, **kw)
# return cls._instance
# def __str__(self):
# return ‘singleton 的 实例‘
def __repr__(self):
return ‘singleton repr‘
one = Singleton()
two = Singleton()
# print(‘%s‘%one)
# two.a = 3
# print(one.a)
# print(id(one))
# print(id(two))
# print(one == two)
# print(one is two)
#面试的时候
#单例模式是一种设计模式
#设计模式早期只在java里使用
# l = list()
# l.append(123)
# print(l)
# print(‘%r is somebody‘%‘alex‘)
# print(‘%s is somebody‘%‘alex‘)
#这个类有100个对象,只要name和sex相同,我就认为是相同的对象
#要求对100个对象进行去重
class Person:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __hash__(self):
return hash(self.name+self.sex)
def __eq__(self, other):
if self.name == other.name and self.sex == other.sex:return True
p_lst = []
for i in range(84):
p_lst.append(Person(‘egon‘,i,‘male‘))
print(p_lst)
print(set(p_lst))
基于TCP协议的简单套接字通信
客户端:
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
#发起电话链接
phone.connect((‘127.0.0.1‘,8080))
#发消息
phone.send(‘hello‘.encode(‘utf-8‘))
#收消息
data=phone.recv(1024)
print(data)
#关机
phone.close()
服务端
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
#绑定手机卡
phone.bind((‘127.0.0.1‘,8080))
#开机
phone.listen(5)
#等电话链接
print(‘starting...‘)
conn,client_addr=phone.accept() #(套接字链接,客户端的ip和port)
print(conn)
# print(client_addr)
#收消息
data=conn.recv(1024) # 1024最大的限制
print(‘客户端数据: ‘,data)
#发消息
conn.send(data.upper())
#挂电话
conn.close()
#关机
phone.close()
加上通信循环和链接循环
服务端:
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
# phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
#绑定手机卡
phone.bind((‘127.0.0.1‘,8080))
#开机
phone.listen(5)
#等电话链接
print(‘starting...‘)
while True:
conn,client_addr=phone.accept() #(套接字链接,客户端的ip和port)
print(client_addr)
while True: #通信循环
#收消息
try:
data=conn.recv(1024) # 1024最大的限制
print(‘客户端数据: ‘,data)
if not data:break #针对linux系统
#发消息
conn.send(data.upper())
except ConnectionResetError:
break
#挂电话
conn.close()
#关机
phone.close()
客户端0:
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
#发起电话链接
phone.connect((‘127.0.0.1‘,8080))
while True:
#发消息
msg=input(‘>>: ‘).strip()
if not msg:continue
phone.send(msg.encode(‘utf-8‘))
print(‘has send====>‘)
#收消息
data=phone.recv(1024)
print(‘has recv=====>‘)
print(data.decode(‘utf-8‘))
#关机
phone.close()
客户端1
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
#发起电话链接
phone.connect((‘127.0.0.1‘,8080))
while True:
#发消息
msg=input(‘>>: ‘).strip()
if not msg:continue
phone.send(msg.encode(‘utf-8‘))
print(‘has send====>‘)
#收消息
data=phone.recv(1024)
print(‘has recv=====>‘)
print(data.decode(‘utf-8‘))
#关机
phone.close()
客户端2
import socket
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
#发起电话链接
phone.connect((‘127.0.0.1‘,8080))
while True:
#发消息
msg=input(‘>>: ‘).strip()
if not msg:continue
phone.send(msg.encode(‘utf-8‘))
print(‘has send====>‘)
#收消息
data=phone.recv(1024)
print(‘has recv=====>‘)
print(data.decode(‘utf-8‘))
#关机
phone.close()
实现ssh远程执行命令的功能(low版)
服务端:
import socket
import subprocess
import struct
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
phone.bind((‘127.0.0.1‘,8080))
phone.listen(5)
while True:
conn,client_addr=phone.accept() #(套接字链接,客户端的ip和port)
print(client_addr)
while True: #通信循环
#收消息
try:
cmd=conn.recv(1024) # 1024最大的限制
if not cmd:break #针对linux系统
#执行,拿到执行结果
obj = subprocess.Popen(cmd.decode(‘gbk‘), shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout_res=obj.stdout.read()
stderr_res=obj.stderr.read()
#先发报头
total_size=len(stderr_res)+len(stdout_res)
conn.send(struct.pack(‘i‘,total_size))
#再发真是的数据
# conn.send(stdout_res+stderr_res)
conn.send(stdout_res)
conn.send(stderr_res)
except ConnectionResetError:
break
#挂电话
conn.close()
#关机
phone.close()
客户端:
import socket
import struct
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
#发起电话链接
phone.connect((‘127.0.0.1‘,8080))
while True:
#发消息
cmd=input(‘>>: ‘).strip()
if not cmd:continue
phone.send(cmd.encode(‘gbk‘))
#先收报头
header_struct=phone.recv(4)
total_size=struct.unpack(‘i‘,header_struct)[0]
#再收消息
cmd_res=b‘‘
recv_size=0
while recv_size < total_size:
recv_data=phone.recv(1024)
cmd_res+=recv_data
recv_size+=len(recv_data)
print(cmd_res.decode(‘gbk‘))
#关机
phone.close()
粘包
服务端1:
from socket import *
server=socket(AF_INET,SOCK_STREAM)
server.bind((‘127.0.0.1‘,8080))
server.listen()
conn,addr=server.accept()
data1=conn.recv(5)
print(‘data1:‘,data1)
data2=conn.recv(5)
print(‘data2:‘,data2)
客户端1:
from socket import *
client=socket(AF_INET,SOCK_STREAM)
client.connect((‘127.0.0.1‘,8080))
client.send(‘hello‘.encode(‘utf-8‘))
# import time
# time.sleep(10)
client.send(‘world‘.encode(‘utf-8‘))
服务端2:
from socket import *
server=socket(AF_INET,SOCK_STREAM)
server.bind((‘127.0.0.1‘,8080))
server.listen()
conn,addr=server.accept()
data1=conn.recv(1)
print(‘data1:‘,data1)
import time
time.sleep(5)
data2=conn.recv(1024)
print(‘data2:‘,data2)
客户端2:
from socket import *
client=socket(AF_INET,SOCK_STREAM)
client.connect((‘127.0.0.1‘,8080))
client.send(‘hello‘.encode(‘utf-8‘))
import time
time.sleep(3)
client.send(‘world‘.encode(‘utf-8‘))
实现ssh远程执行命令的功能(最终版)
服务端:
import socket
import subprocess
import struct
import json
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
phone.bind((‘127.0.0.1‘,8080))
phone.listen(5)
while True:
conn,client_addr=phone.accept() #(套接字链接,客户端的ip和port)
print(client_addr)
while True: #通信循环
#收消息
try:
cmd=conn.recv(1024) # 1024最大的限制
if not cmd:break #针对linux系统
#执行,拿到执行结果
obj = subprocess.Popen(cmd.decode(‘gbk‘), shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout_res=obj.stdout.read()
stderr_res=obj.stderr.read()
# 制作报头
header_dic = {
‘filename‘: ‘a.txt‘,
‘total_size‘: len(stdout_res)+len(stderr_res),
‘md5‘: ‘xxxxxxxxx‘
}
head_json = json.dumps(header_dic)
head_bytes = head_json.encode(‘utf-8‘)
#先发报头长度
conn.send(struct.pack(‘i‘,len(head_bytes)))
#先发报头
conn.send(head_bytes)
#再发真是的数据
# conn.send(stdout_res+stderr_res)
conn.send(stdout_res)
conn.send(stderr_res)
except ConnectionResetError:
break
#挂电话
conn.close()
#关机
phone.close()
客户端:
import socket
import struct
import json
#买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STREAM代表TCP协议
#发起电话链接
phone.connect((‘127.0.0.1‘,8080))
while True:
#发消息
cmd=input(‘>>: ‘).strip()
if not cmd:continue
phone.send(cmd.encode(‘gbk‘))
#先收报头长度
struct_res=phone.recv(4)
header_size=struct.unpack(‘i‘,struct_res)[0]
#再收报头
head_bytes=phone.recv(header_size)
head_json=head_bytes.decode(‘utf-8‘)
head_dic=json.loads(head_json)
print(head_dic)
#最收消息
cmd_res=b‘‘
recv_size=0
total_size=head_dic[‘total_size‘]
while recv_size < total_size:
recv_data=phone.recv(1024)
cmd_res+=recv_data
recv_size+=len(recv_data)
print(cmd_res.decode(‘gbk‘))
#关机
phone.close()
异常处理try
print(‘====>1‘)
print(‘====>2‘)
print(‘====>3‘)
# l=[]
# l[1000000000000000000000000000000000000000000]
# d={}
# d[‘k‘]
age=input(‘>>: ‘).strip()
if age.isdigit():
int(age)
print(‘====>4‘)
print(‘====>5‘)
print(‘====>6‘)
执行系统命令的模块
# import os
#
# res=os.system(‘dir‘)
# print(‘命令的结果‘,res)
# import subprocess
#
# obj=subprocess.Popen(‘dir‘,shell=True,
# stdout=subprocess.PIPE,
# stderr=subprocess.PIPE)
#
#
#
# stdout_res1=obj.stdout.read()
# print(stdout_res1.decode(‘gbk‘))
# stdout_res2=obj.stdout.read() #在第一次读时,管道就空了
# print(‘========>‘,stdout_res2.decode(‘gbk‘))
# import subprocess
#
# obj=subprocess.Popen(‘diasdfasdfasr‘,shell=True,
# stdout=subprocess.PIPE,
# stderr=subprocess.PIPE)
# stdout_res1=obj.stdout.read() #命令执行错误会把结果送到stderr管道
# print(stdout_res1.decode(‘gbk‘))
# stdout_res2=obj.stderr.read() #命令执行错误会把结果送到stderr管道
# print(stdout_res2.decode(‘gbk‘))
#ls ; pwasdfasdfd; echo 123
#ls && pwd && echo 123
#执行命令
# import subprocess
#
# obj=subprocess.Popen(‘tasklist | findstr pycharm‘,shell=True,
# stdout=subprocess.PIPE,
# stderr=subprocess.PIPE)
#
# print(obj.stdout.read().decode(‘gbk‘))
import subprocess
obj1=subprocess.Popen(‘tasklist‘,shell=True,
stdout=subprocess.PIPE,)
obj2=subprocess.Popen(‘findstr pycharm‘,shell=True,
stdin=obj1.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
print(obj2.stdout.read().decode(‘gbk‘))
以上是关于day8-套接字sock 实现SSH远程执行命令功能的主要内容,如果未能解决你的问题,请参考以下文章
python基础之socket编程-------基于tcp的套接字实现远程执行命令的操作