socket编程模拟linux下的ssh代码实现
实现思路:
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代码实现的更多相关文章
- 使用PHP Socket 编程模拟Http post和get请求
这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法. <?php /** * 使用PHP ...
- linux下的.ssh文件夹路径等
1.linux下的.ssh文件夹在~下,直接cd ~/.ssh即可 2.tp经过gd类处理过的水印图片格式为png 3.前端扒下别人家的网站如果自己本地打开有出现相同的代码段则有可能是js动态添加的, ...
- linux下开启SSH,并且允许root用户远程登录,允许无密码登录
参考:http://blog.csdn.net/jia0511/article/details/8237698 1. 允许root用户远程登录 修改ssh服务配置文件 sudo vi /etc/ssh ...
- ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访问(转)
转自:http://blog.csdn.net/pennyliang/article/details/8556662 ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访 ...
- linux 下的ssh免密登陆设置
一,原理 说明: A为linux服务器a B为linux服务器b 每台linux都有ssh的服务端和客户端,linux下的ssh命令就是一个客户端 我们常用ssh协议来进行登陆或者是文件的拷贝,都需要 ...
- Linux下C/C++代码调用PHP代码(转)
Linux下C/C++代码可以通过popen系统函数调用PHP代码并通过fgets函数获取PHP代码echo输出的字符串. //main.c char str[1024] = {0}; char * ...
- Linux 下使用 ssh 登录局域网其他电脑的方法
Linux 下使用 ssh 登录局域网其他电脑的方法 首先查看电脑是否安装 ssh 客户端,如果没有执行下面命令安装客户端. sudo apt-get install openssh-client s ...
- Linux下使用SSH、Crontab、Rsync三工具实现数据自动备份
Linux下使用SSH.Crontab.Rsync三工具实现数据自动备份 作为网管人员大概都无一例外的经历过系统备份,尤其是重要系统的备份.重要数据库系统的备份工作.由于备份是个频繁而琐碎的工作,如何 ...
- socket编程(Linux)
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
随机推荐
- ./autogen.sh: 4: autoreconf: not found
./autogen.sh: 4: autoreconf: not found 是在不同版本的 tslib 下执行 autogen.sh 产生.它们产生的原因一样,是因为没有安装 automake ...
- codeforces A. Punctuation 解题报告
题目链接:http://codeforces.com/problemset/problem/147/A 题目意思:给定一篇文章,需要对这篇文章进行编辑,使得:(1)两个单词之间有一个空格分开 (2) ...
- AndroidManifest配置之uses-sdk
uses-sdk配置 uses-sdk用来设置app对android系统的兼容性.它包含三个可选的配置项,分别为android:minSdkVersion,android:targetSdkVersi ...
- Css的使用细谈
Css的使用细谈 Css可以通过简单的更改CSS文件,改变网页的整体表现形式,可以减少我们的工作量,所以她是每一个网页设计人员的必修课. Css简介 (1) CSS是用于布局 ...
- atexit函数详解
对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程 ...
- android 收集的一些颜色值
<?xml version="1.0" encoding="utf-8"?> <resources> <color name=&q ...
- wp8环境搭建
Windows Phone 8将采用与Windows 8相同的NT内核,这就意味着WP8将可能兼容Win8应用,开发者仅需很少改动就能让应用在两个平台上运行.由于内核变更,Windows Phone ...
- 方法名的string类型应用(补)
string strClass = "stringConvertClass.test"; //命名空间+类名 string strMethod = "Method&quo ...
- python常用第三方库(转载)
Python标准库与第三方库详解(转载) 转载地址: http://www.codeweblog.com/python%e6%a0%87%e5%87%86%e5%ba%93%e4%b8%8e%e7%a ...
- 【网络爬虫】【python】网络爬虫(三):模拟登录——伪装浏览器登录爬取过程
一.关于抓包分析和debug Log信息 模拟登录访问需要设置request header信息,对于这个没有概念的朋友可以参见本系列前面的java版爬虫中提到的模拟登录过程,主要就是添加请求头requ ...