实现思路:

1.提供输入指令的客户端;

2.提供返回执行指令结果的服务端

3.寻找服务端返回结果一次无法全部接收的解决思路

服务端代码(ssh_server.py)

 #coding=utf-8
import socket,os server = socket.socket()
server.bind(('localhost', 9999))
server.listen()
client,addr = server.accept()
while True:
data = client.recv(1024)
if data == '' or data == None:continue
cmd_res = os.popen(data.decode()).read()
if len(cmd_res) == 0:
cmd_res = '指令无效,请重新输入'
client.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))
client.recv(1024)#更改后
client.send(cmd_res.encode('utf-8'))
print(len(cmd_res))
server.close()
客户端代码(ssh_client.py)
 # coding = utf-8
import socket client = socket.socket()
client.connect(('localhost',9999))
while True:
cmd = input('>>:').strip()
if len(cmd) == 0:continue
client.send(cmd.encode('utf-8'))
data_size = int(client.recv(1024).decode())
print(data_size) #字节大小
curr_size = 0
final_res = b''
while data_size != curr_size:
data = client.recv(1024)
curr_size += len(data)
print(curr_size)
final_res+=data
print(final_res.decode())
潜在问题
由于服务器两次发送的数据间歇时间太短,容易造成粘包(服务器发送出的两条信息同时到缓存中,缓存区未满或未超时时内部机制是知道缓存区满才将消息拿出来,多次发送的信息资料由于此种机制的制约
很容易造成粘包,解决思路a.服务器两次发送信息中间加一个是时间间隙,time.sleep(2);b.服务端发出上一条信息后客户端接受到消息后向服务器返回一个标识,服务端接受到该标识后再发送第二波消息)
改进后代码(ssh_server.py):

#coding=utf-8
import socket,os server = socket.socket()
server.bind(('localhost', 9999))
server.listen()
client,addr = server.accept()
while True:
data = client.recv(1024)
if data == '' or data == None:continue
cmd_res = os.popen(data.decode()).read()
if len(cmd_res) == 0:
cmd_res = '指令无效,请重新输入'
client.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))
client.recv(1024)#b方式更改后
client.send(cmd_res.encode('utf-8'))
print(len(cmd_res))
server.close()

改进后代码(ssh_client.py


# coding = utf-8
import socket client = socket.socket()
client.connect(('localhost',9999))
while True:
cmd = input('>>:').strip()
if len(cmd) == 0:continue
client.send(cmd.encode('utf-8'))
data_size = int(client.recv(1024).decode())
client.send("received the message...")#b方式更改后
print(data_size) #字节大小
curr_size = 0
final_res = b''
while data_size != curr_size:
data = client.recv(1024)
curr_size += len(data)
print(curr_size)
final_res+=data
print(final_res.decode())
 
												

socket编程模拟linux下的ssh代码实现的更多相关文章

  1. 使用PHP Socket 编程模拟Http post和get请求

    这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法. <?php /** * 使用PHP ...

  2. linux下的.ssh文件夹路径等

    1.linux下的.ssh文件夹在~下,直接cd ~/.ssh即可 2.tp经过gd类处理过的水印图片格式为png 3.前端扒下别人家的网站如果自己本地打开有出现相同的代码段则有可能是js动态添加的, ...

  3. linux下开启SSH,并且允许root用户远程登录,允许无密码登录

    参考:http://blog.csdn.net/jia0511/article/details/8237698 1. 允许root用户远程登录 修改ssh服务配置文件 sudo vi /etc/ssh ...

  4. ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访问(转)

    转自:http://blog.csdn.net/pennyliang/article/details/8556662 ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访 ...

  5. linux 下的ssh免密登陆设置

    一,原理 说明: A为linux服务器a B为linux服务器b 每台linux都有ssh的服务端和客户端,linux下的ssh命令就是一个客户端 我们常用ssh协议来进行登陆或者是文件的拷贝,都需要 ...

  6. Linux下C/C++代码调用PHP代码(转)

    Linux下C/C++代码可以通过popen系统函数调用PHP代码并通过fgets函数获取PHP代码echo输出的字符串. //main.c char str[1024] = {0}; char *  ...

  7. Linux 下使用 ssh 登录局域网其他电脑的方法

    Linux 下使用 ssh 登录局域网其他电脑的方法 首先查看电脑是否安装 ssh 客户端,如果没有执行下面命令安装客户端. sudo apt-get install openssh-client s ...

  8. Linux下使用SSH、Crontab、Rsync三工具实现数据自动备份

    Linux下使用SSH.Crontab.Rsync三工具实现数据自动备份 作为网管人员大概都无一例外的经历过系统备份,尤其是重要系统的备份.重要数据库系统的备份工作.由于备份是个频繁而琐碎的工作,如何 ...

  9. socket编程(Linux)

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

随机推荐

  1. SQL 系统表应用

    查看link server select DD.System,DD.DB,DD.previous_processing_dte, DD.processing_dte,LS.LinkServerName ...

  2. HBase开发

    MapReduce接口 HBase提供了TableInputFormat.TableOutputFormat.TableMapper和TableReducer类来支持使用MapReduce框架处理HB ...

  3. Java线程池技术以及实现

    对于服务端而言,经常面对的是客户端传入的短小任务,需要服务端快速处理并返回结果.如果服务端每次接受一个客户端请求都创建一个线程然后处理请求返回数据,这在请求客户端数量少的阶段看起来是一个不错的选择,但 ...

  4. android中requestFocus

    标签用于指定屏幕内的焦点View. 例如我们点击tab键或enter键焦点自动进入下一个输入框用法: 将标签置于Views标签内部 <EditText id="@+id/text&qu ...

  5. 万亿级日志与行为数据存储查询技术剖析——Hbase系预聚合方案、Dremel系parquet列存储、预聚合系、Lucene系

    转自:http://www.infoq.com/cn/articles/trillion-log-and-data-storage-query-techniques?utm_source=infoq& ...

  6. codeforces 701C C. They Are Everywhere(尺取法)

    题目链接: C. They Are Everywhere time limit per test 2 seconds   memory limit per test 256 megabytes inp ...

  7. 关于SelectObject之后是否要恢复之前的GDI对象

    以下列代码为例 { // 创建内存DC CDC mMemDc; mMemDc.CreateCompatibleDC( &dc ); // 创建兼容位图 CBitmap bmpMemBmp; b ...

  8. mysql 数据库修改用户名和密码

    因为经常修改数据库密码,也找到了几种修改数据库密码的方式,在这里给大家介绍下供大家参考通过navicat 管理数据库客户端来修改数据库密码: 选择数据库 --- 点击导航条的用户  --- 编辑用户 ...

  9. luogu 3389 【模板】高斯消元

    大概就是对每一行先找到最大的减小误差,然后代入消元 #include<iostream> #include<cstdio> #include<cstring> #i ...

  10. HihoCoder 1504 : 骑士游历 (矩阵乘法)

    描述 在8x8的国际象棋棋盘上给定一只骑士(俗称“马”)棋子的位置(R, C),小Hi想知道从(R, C)开始移动N步一共有多少种不同的走法. 输入 第一行包含三个整数,N,R和C. 对于40%的数据 ...