socket编程模拟linux下的ssh代码实现

实现思路:

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

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

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

服务端代码(ssh_server.py)

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

#coding=utf-8import 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-8import 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())
 


原文地址:https://www.cnblogs.com/g177w/p/8119968.html

时间: 2024-10-01 00:37:47

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

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

这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法. <?php /** * 使用PHP Socket 编程模拟Http post和get请求 * @author koma */ class Http{ private $sp = "\r\n"; //这里必须要写成双引号 private $protocol = 'HTTP/1.1'; private $requestLine

Linux下的ssh环境搭建与管理

Linux下的ssh环境搭建与管理 实验环境 1:网桥模式 2:安装好vmtoos 3:安装好yum 4:安装好ssh相关软件包 5:服务端:xuegod-63   IP:192.168.1.63 客户端:xuegod-64   IP:192.168.1.64 客户端普通用户:ceshi  密码:123456 6:安装好扫描软件rpm -ivh/mnt/Packages/nmap-5.21-4.el6.x86_64.rpm 实验目标 1:SSHD服务介绍 2:SSHD服务安装配置 3:两Linu

Linux下通过ssh连接github

github每次pull/push代码时要求推送代码的用户是合法的,所以每次推送时候都要输入账号密码用以验证用户是否为合法用户,而ssh是一种安全的传输模式,可以代替用户的这一"输入账号密码"的行为来验证用户. github共支持2种操作方式 https 可以随意克隆github上的项目,而不管是谁的:在pull/push的时候是需要验证用户名和密码的 ssh 克隆者必须是拥者或管理员,且需要先添加 SSH key ,否则无法克隆.在pull/push的时候不再是验证用户名和密码,而是

Linux下的ssh实验环境搭建与管理

Linux下的ssh实验环境搭建与管理 实验环境 服务端:xuegod-63   IP:192.168.1.63 客户端:xuegod-64   IP:192.168.1.64 客户端普通用户:ceshi  密码:123456 安装好扫描软件rpm -ivh /mnt/Packages/nmap-5.21-4.el6.x86_64.rpm 实验目标 1:SSHD服务介绍 2:SSHD服务安装配置 3:两Linux服务器之间数据拷贝 4:SSHD服务作用: 实验步骤 1:搭建环境 1):网桥模式

编程实现Linux下的ls -l

头文件 #ifndef __FUNC_H__ #define __FUNC_H__ #include<stdio.h> #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #inc

编程实现LINUX下目录的层层遍历

/************************************************************************* > File Name: treedir.c > Author: KrisChou > Mail:[email protected] > Created Time: Tue 19 Aug 2014 05:04:50 PM CST *****************************************************

编程实现linux下的shell

/************************************************************************* > File Name: Kris_shell.c > Author: KrisChou > Mail:[email protected] > Created Time: Thu 21 Aug 2014 04:31:55 PM CST **************************************************

转载: linux下创建svn代码库

linux下创建svn代码库 1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get install subversion 1.2.源码安装 http://www.cnblogs.com/fengbohello/p/4142810.html 2.开启svn服务进程 2.1.我的习惯是把代码仓库放在/opt/svn目录下,所以先创建目录/opt/svn $

Linux下编译C代码,出现tan函数报错的情况

undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的时候 加上参数 -lm 有说l表示Lib ,m表示 math.h  , ****************************************************************************************************** 以下是一些说明 使用math.h