用python实现ssh功能,且输入bye自动退出

版本:python3+

##服务端代码

#/usr/bin/env python
#_*_coding:utf-8_*_
#yehui
from socket import *
from time import ctime
import os

class TimeOutCommand: ##shell命令超时退出,默认2秒
def command_timeout(self, command, timeout=2):
import subprocess, datetime, time, signal
self.cmd = command.split(" ")
self.start = datetime.datetime.now()
try:
self.process = subprocess.Popen(self.cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except FileNotFoundError:
self.err = format("不存在的shell命令: %s" % ' '.join(self.cmd))
return self.err

while self.process.poll() is None:
time.sleep(0.2)
self.now = datetime.datetime.now()
if (self.now - self.start).seconds > timeout:
os.kill(self.process.pid, signal.SIGKILL)
os.waitpid(-1, os.WNOHANG)
return None
self.res = self.process.stdout.readlines()
self.rn = ''.join(list(str(self.i.decode('utf8')) for self.i in self.res))
return self.rn

class SocketServer:
def __init__(self):
self.HOST = ''
self.PORT = 9999
self.BUFSIZE = 1024
self.ADDR = (self.HOST, self.PORT)
self.tcpSerSock = socket(AF_INET, SOCK_STREAM)
self.tcpSerSock.bind(self.ADDR)
self.tcpSerSock.listen(5)
self.quit = False
self.shutdown = False

def wait_conection(self):
while True:
print('waiting for connection...')
self.tcpCliSock, self.addr = self.tcpSerSock.accept()
print('...connected from: ', self.addr)

while True:
self.data = self.tcpCliSock.recv(self.BUFSIZE)
# data = data.decode('utf8')
self.data = str(self.data, encoding='utf8') ##由于recv接收到的信息为二进制的bytes,所以需要将它转换成utf8字符串
if not self.data:
break
self.ss = '[%s] %s' % (ctime(), self.data)
if self.data == 'bye':break
#self.data = os.popen("%s" % self.data).read()
self.data = TimeOutCommand().command_timeout(self.data)
#self.data = format("这是服务端发出的信息 %s \n" % self.ss)+self.data
self.tcpCliSock.send(self.data.encode('utf8'))
print('Bye-bye: [%s: %d]' % (self.addr[0], self.addr[1]))
self.tcpCliSock.close()


if __name__ == '__main__':
c = SocketServer()
c.wait_conection()


##客户端代码
#/usr/bin/env python
#_*_coding:utf-8_*_
#yehui
from socket import *
import readline

class SocketClient:
def __init__(self, host='localhost', port=9999, bufsize=1024):
self.HOST = host
self.PORT = port
self.BUFSIZE = bufsize
self.ADDR = (self.HOST, self.PORT)

def client_connect(self):
self.tcpCliSock = socket(AF_INET, SOCK_STREAM)
self.tcpCliSock.connect(self.ADDR)
while True:
self.data = input('>')
if not self.data:
continue
print('input data: [%s]' % self.data)
self.tcpCliSock.send(self.data.encode('utf8'))
self.rdata = self.tcpCliSock.recv(self.BUFSIZE)
if not self.rdata:
break
print(self.rdata.decode('utf8'))
if self.data == 'bye' or self.data == 'shutdown':
break
self.tcpCliSock.close()


if __name__ == '__main__':
c = SocketClient()
c.client_connect()
posted @ 2018-05-25 10:05  soranao  阅读(674)  评论(0编辑  收藏  举报