在python socket知识点中已经对socket进行了初步的了解,那现在就使用这些知识来实现一个简单的ssh(Secure Shell)功能。

  首先同样是建立两个端(服务器端和客户端)

  需求是:服务器端需要对客户端发送过来的命令进行相应,并将响应内容返回给客户端。

  看似很简单的需求,但是如何响应命令行?python官方建议buffer的大小不宜超过8k(8192byte),如果返回的数据大于了buffer如何让客户端接收完全?信号传输过程只能通过byte类型,而命令执行过程又需要使用到str,所以在程序中的类型转换也至关重要。

服务器端:

while True:#多用户连接
conn,addr = server.accept()#等活动开始,accept会返回两个值,conn就是客户端对应在服务器端的连接实例,addr就是客户端链接过来的地址,产生阻塞
while True:
print("listened")
data = conn.recv(1024)#不超过8192,默认是阻塞的,当客户端一断开,会陷入一个死循环,因为客户端会不断的发空""
if not data:
print("客户端已断开")
break
print('执行指令:',data)
cmd_os = os.popen(data.decode()).read()#地址为当前所在目录
cmd_byte = cmd_os.encode('utf-8')
print('发送长度',len(cmd_byte))
if len(cmd_os) == 0:#客户端已断开
cmd_os = "Invalid Command"
conn.send(str(len(cmd_byte)).encode('utf-8'))#发送第一个:回传长度,判断是否需要循环接收数据
conn.send(cmd_os.encode('utf-8'))#发送第二个:回传数据,将结果返回给客户端
print('send done....')
server.close()

客户端:

import socket
client = socket.socket()#声明socket的类型,同时生成socket的连接对象
client.connect(('localhost',6969) )#连接的端口号和端口名
while True:
msg = input('>>:'.strip())
if len(msg) == 0:
continue
client.send(msg.encode('utf-8'))#需要发送的数据
print('send',msg)
data_size = 0#定义收到的数据大小
recv_data = b''#初始化接收数据
res_size = client.recv(1024)#接收从服务器端回传的数据大小
print('the length of res:',res_size.decode())
while data_size < int(res_size.decode()):#如果数据大小小于回传的数据大小便循环接收
recv_data+= client.recv(1024)#默认最大接收的字节数
data_size = len(recv_data)#进行下次循环判定
else:
print('the length of recv:',len(recv_data))
print(recv_data.decode())#打印接收到的数据 client.close()#关闭客户端

  由以上程序,便可实现完整的命令传递以及结果回传。实现简单的ssh功能。

运用socket实现简单的ssh功能的更多相关文章

  1. 大聊Python----通过Socket实现简单的ssh客户端

    光只是简单的发消息.收消息没意思,干点正事,可以做一个极简版的ssh,就是客户端连接上服务器后,让服务器执行命令,并返回结果给客户端. #ssh_client.py import socket cli ...

  2. 实现简单的ssh功能

    客户端代码: # -*- coding=utf-8 -*- __Author__ = "Dennis" import socket client = socket.socket() ...

  3. 通过socket实现多个连接并实现ssh功能

    一.前言 上一篇中我们已经知道了客户端通过socket来连接服务端,进行了一次数据传输,那如何实现客户端多次发生数据?而服务端接受多个客户端呢? 二.发送中文信息 在python3中,socket只能 ...

  4. python通过socket实现多个连接并实现ssh功能详解

    python通过socket实现多个连接并实现ssh功能详解 一.前言 上一篇中我们已经知道了客户端通过socket来连接服务端,进行了一次数据传输,那如何实现客户端多次发生数据?而服务端接受多个客户 ...

  5. 网络编程基础【day09】:实现简单地ssh(四)

    本节内容 概述 简单ssh socket接收大数据的困惑 一.概述 我们用过linux的就知道什么是ssh,它是一种客户端和服务端交互返回的一个解决,输入一个命令,给我返回什么,接下来我们说一说,如何 ...

  6. socket.io简单入门(一.实现简单的图表推送)

    引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器.但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素. 研究本例主 ...

  7. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  8. Socket实现简单的聊天通信

    最近学习了Socket后,感觉Socket挺好玩的,在博客中看到socket在实时聊天功能的很强大,于是乎就做了一个简单的聊天功能,今天贴出来,能够与大家一起共享,有不对之处,能够给予指出,谢谢! 服 ...

  9. Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能

    本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...

随机推荐

  1. JBoss AS7(Application Server 7)的Standalone模式和Domain模式

    JBoss AS7(Application Server 7)支持两种引导模式:standalone和domain(域). Standalone模式对于很多应用,并不需要domain管理能力,JBos ...

  2. bzoj 3622 已经没有什么好害怕的了 类似容斥,dp

    3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1213  Solved: 576[Submit][Status][ ...

  3. CentOs下Mongodb的下载与安装

    1.下载MongoDB(64位) http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz tar zxvf mongodb-lin ...

  4. git一键部署代码到远程服务器(linux)(采坑总结)

    原来一直使用FileZilla来代码部署,去年使用git,代码版本管理,真TM好用,一起回顾下历程! 一. 代码部署方式及思路: 1. 使用FTP/SFTP工具,上传代码 2. git人工部署.1. ...

  5. qml 静态编译程序执行错误 无法定位程序输入点 CreateDXGIFactory2 于动态链接库 dxgi.dll 上

    重新编译 qt 静态库即可,或 删除该动态库. -no-feature-d3d12 解决方案请参考如下网址: https://forum.qt.io/topic/78380/entry-point-n ...

  6. Qt 网络模块如何使用?

    1.网络模块介绍 类名 说明 中文 QAbstractNetworkCache The interface for cache implementations 缓存实现的接口 QNetworkCach ...

  7. BUNOJ 1011

    字符串处理的题.原题链接 AC代码: #include<cstring> #include<cstdio> #include<string> #include< ...

  8. nyoj 1129 Salvation 模拟

    思路:每个坐标有四种状态,每个点对应的每种状态只能走一个方向,如果走到一个重复的状态说明根本不能走到终点,否则继续走即可. 坑点:有可能初始坐标四周都是墙壁,如果不判断下可能会陷入是死循环. 贴上测试 ...

  9. React Native填坑之旅 -- 回归小插曲

    回归RN,非常开心啊! 在React Native 0.49.5上开发,直接遇到一个ios模拟器的问题.这个问题很简单就是Bundle URL not present. 在网上找了很多的解决方法,都不 ...

  10. Ironic中pxe driver和agent driver的区别

    历史问题: 以pxe_ipmitool 和agent_ipmitool为例,看起来似乎前者不使用ironic-python-agent,后者使用,但是实际上两者都使用ironic-python-age ...