OSI七层模型(Open System Interconnection,开放式系统互联)

应用层
网络进程访问应用层:
为应用程序进程(例如:电子邮件、文件传输和终端仿真)提供网络服务;
提供用户身份验证 表示层
数据表示:
确保接收系统可以读出该数据;
格式化数据;
构建数据;
协商用于应用层的数据传输语法;
提供加密 回话层
主机间通信:
建立、管理和终止在应用程序之间的会话 传输层
传输问题:
确保数据传输的可靠性;
建立、维护和终止虚拟电路;
通过错误检测和恢复;
信息流控制来保证可靠性 网络层
数据传输:
路由数据包;
选择传递数据的最佳路径;
支持逻辑寻址和路径选择 数据链路层
访问介质:
定义如何格式化数据以便进行传输以及如何控制对网络的访问;
支持错误检测 物理层
二进制传输:单位比特
为启动、维护以及关闭物理链路定义了电器规范、机械规范、过程规范和功能

  

socket    实例化一个套接字

bind      绑定到地址和端口

listen    开始监听

accept   等待wait传入连接

recv   接受数据

send   发送数据(默认发送大小是32768(32k)大小)

sendall 发送所有数据

close  关闭socket

  

一、简单的通信过程

服务端:

import socket

#实例化,绑定,监听,等待,解构(标识,ip-port),接收,回应,关闭
server = socket.socket() server.bind(('localhost',6969))
server.listen()
print('开始监听...') conn,addr = server.accept()
print(conn,addr) data = conn.recv(1024)
print('服务端接收到数据:',data.decode()) conn.send('Hi, i am the server.'.encode()) server.close()

  

客户端:

import socket

#实例化,连接,发送,接收回应,关闭
client = socket.socket() client.connect(('localhost',6969)) client.send('Hi,i am the client.'.encode())
print('发送数据...') data = client.recv(1024)
print('客户端接收到数据:',data.decode()) client.close()

 

输出结果: 

1. 先运行服务端,监听端口,开始等待传入数据:

开始监听...

2. 启动客户端,发送数据,接收响应:

发送数据...
客户端接收到数据: Hi, i am the server.

  

3. 回到服务端,查看接收到的数据:

开始监听...
<socket.socket fd=6, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 55149)> ('127.0.0.1', 55149)
接收到的数据: Hi,i am the client.

  

二、模拟ssh远程命令执行

服务器端:

import socket
import time
import os #实例化,绑定,监听,等待,解构(标识,ip-port),接收,响应,关闭
server = socket.socket() server.bind(('localhost', 6969))
server.listen(3) #表示当正在处理一个连接时,最多可以按顺序挂起接下来的3个连接(可以理解成排队),如果第4个来连接,过了一定时间就会抛出超时异常:TimeoutError: [Errno 60] Operation timed out
print('开始监听...') try:
while True:
conn,addr = server.accept()
# print(conn,addr)
peerip,peerport = conn.getpeername()
localip,localport = conn.getsockname()
print('{}:{} --> {}:{}'.format(peerip,peerport,localip,localport)) while True:
data = conn.recv(1024)
if not data:
break
print(data.decode())
ret = os.popen(data.decode()).read()
conn.send(ret.encode())
server.close()
except KeyboardInterrupt as e:
print('连接被中断...')

  

  

客户端

import socket

#实例化,连接,发送,接收响应,关闭
client = socket.socket() client.connect(('localhost',6969))
print('正在连接服务端...') while True:
msg = input('>>>').strip()
# print('正在发送数据...')
if not msg:
continue
client.send(msg.encode())
# print('已发送...') data = client.recv(1024)
if not data:
break
print(data.decode()) client.close()

  

  

运行结果:

1. 服务端:

开始监听...

2. 客户端(可以输入执行的命令,接收到服务端返回的执行结果):

正在连接服务端...
>>>ls -l
total 48
-rw-r--r-- 1 zhangsan staff 222 Nov 10 10:37 1.0.py
-rw-r--r-- 1 zhangsan staff 433 Nov 10 16:49 2.0.py
-rw-r--r-- 1 zhangsan staff 158 Nov 10 23:18 error.log
-rw-r--r-- 1 zhangsan staff 437 Nov 11 14:10 socket_client1.py
-rw-r--r-- 1 zhangsan staff 1010 Nov 11 14:21 socket_server1.py
-rw-r--r-- 1 zhangsan staff 608 Nov 10 23:31 异常处理.py >>>ls -l ../
total 0
drwxr-xr-x 7 zhangsan staff 224 Nov 8 12:51 1106
drwxr-xr-x 11 zhangsan staff 352 Nov 9 11:33 1108
drwxr-xr-x 8 zhangsan staff 256 Nov 11 14:21 1110 >>>

  

  

3. 服务端:  

开始监听...
127.0.0.1:56380 --> 127.0.0.1:6969
ls -l
ls -l ../ #记录执行的命令

  

协议簇:

AF_INET   IPV4

AF_INET6  IPV6

AF_UNIX  本地地址

协议: Protocol

SOCK_STREAM  TCP

SOCK_DGRAM  UDP

SOCK_RAW    原始套接字,可伪造源IP等数据

Python 简单socket模拟ssh的更多相关文章

  1. [Python 网络编程] TCP、简单socket模拟ssh (一)

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...

  2. Socket模拟SSH

    Socket模拟SSH 主要思路 客户端发送相关命令到服务端,服务端执行命令(通过subprocess模块实现)然后将结果返回给客户端 小知识 Linux中可以发送空数据,服务端能接受到空数据 win ...

  3. [Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题

    服务器端: 流程: 1.创建servert实例 2.绑定地址和端口 3.开始监听 4.创建客户端连接实例 5.等待客户端的消息 6.......... # The_author = 'liu66' # ...

  4. python之socket-ssh实例

    本文转载自大王http://www.cnblogs.com/alex3714/articles/5830365.html 加有自己的注释,应该会比原文更突出重点些 一. 基本Socket实例 前面讲了 ...

  5. python 通过socket实现ssh功能

    功能:实现从客户端向服务端发送cmd指令,服务端将结果返回给客户端的功能. #coding:utf-8 '''服务端''' import socket,os server=socket.socket( ...

  6. Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据

    实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...

  7. Python socket模拟HTTP请求

    0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很 ...

  8. 网络编程 - 1.简单的套接字通信/2.加上通信循环/3.bug修复/4.加上链接循环/5.模拟ssh远程执行命令

    1.简单的套接字通信 服务端 ''' 服务端 接电话 客户端 打电话 1.先启动服务端 2.服务端有两种套接字 1.phone 用来干接收链接的 2.conn 用来干收发消息的 ''' import ...

  9. python开发socket套接字:套接字&通信循环&链接循环&模拟远程命令

    一,套接字 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket ...

随机推荐

  1. pseudocode of zigzag conversion

    1.Title : The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ...

  2. 吾八哥学Python(四):了解Python基础语法(下)

    咱们接着上篇的语法学习,继续了解学习Python基础语法. 数据类型大体上把Python中的数据类型分为如下几类:Number(数字),String(字符串).List(列表).Dictionary( ...

  3. javaWeb 基础知识

    cookie  深度解析:  http://blog.csdn.net/ghsau/article/details/20395681 cookie 的作用: 利用存在客户端本地的缓存让无状态的服务器也 ...

  4. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...

  5. 容器与Docker简介(四)Docker容器,镜像与 Registries——微软微服务电子书翻译系列

    当使用Docker时,开发人员创建一个应用程序或服务,并将其和其依赖关系打包到容器镜像中. 镜像是应用程序或服务及其配置和依赖的静态表示形式. 要运行应用程序或服务,应用程序的镜像将被实例化以创建一个 ...

  6. 使用EF对已存在的数据库进行模块化数据迁移

    注:本文面向的是已经对EF的迁移功能有所了解,知道如何在控制台下进行相关命令输入的读者 问题 最近公司项目架构使用ABP进行整改,顺带想用EF的自动迁移代替了以前的手工脚本. 为什么要替代? 请看下图 ...

  7. PHP备忘录

    file_exists()在判断文件是否存在的时候是递归判断每个目录是不是有执行权限. Echo输出大字符串速度慢:打开apache配置项‘deflate’进行压缩输出.

  8. 微信小程序用setData修改数组或对象中的一个属性值

    在page中有如下数组 data: { info:[ { name:"yuki", tou:"../img/head.jpg", zGong:130, gMon ...

  9. angular1.x + ES6开发风格记录

    angular1.x和ES6开发风格 一.Module ES6有自己的模块机制,所以我们要通过使用ES6的模块机制来淡化ng的框架,使得各业务逻辑层的看不出框架的痕迹,具体的做法是: 把各功能模块的具 ...

  10. 机器学习之三:logistic回归(最优化)

    一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大.如果非要应用进入,可以使用logistic回归. logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函 ...