Python的Pexpect库

Pexpect 是一个用来启动子程序并对其进行自动控制的纯 Python 模块。 Pexpect 可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。本文主要是针对ssh远程登录,然后执行简单的新建文件夹与拷贝任务Pexpect 的安装:下载:https://pypi.python.org/pypi/pexpect/解压后在目录下运行:python setup.py installPexpect 的简单使用:from pexpect import *user = 'user'host = 'host'password = 'password'#实现远程登录host机器并新建/home/download/wangling/test目录command = 'sudo ssh -l '+user+' '+host+' sudo mkdir -p /home/download/wangling/test'child = spawn(command , timeout=10   ) child.sendline(password)#实现远程文件拷贝(将本机1.txt文件拷贝到host机器test2目录下2.txt)command1 = 'sudo scp /home/download/wangling/test1/1.txt '+user+'@'+host+':/home/download/wangling/test2/2.txt'child = spawn(command1 , timeout=10   )child.sendline(password)#!/usr/bin/env python
#-*-coding:utf-8-*-
#pexpect库向文件发送数据
from pexpect.fdpexpect import fdspawnf=open('/home/acm506/桌面/python数据库/with.py','ab+')child=fdspawn(f)
child.sendline('age sister')
f.seek(0)
age=child.expect('age')
#成功的标志
if age==0:child.sendline('age success!')
child.close()#!/usr/bin/env python
#-*-coding:utf-8-*-
#ftp 协议进行文件管理
import os 
import sys
import re
import time
import os.path
import pexpect#用户登入
def login_ftp():ftp=pexpect.spawn('ftp',cwd=cwd)if ftp.expect(prmpt)!=0:sys.exit()#连接ftps服务器ftp.sendline(''.join(('open ',ftps)))#提示用户名不成功if ftp.expect('Name')!=0:sys.exit()#发送用户名ftp.sendline(ftpuser)#提示用户名密码输入if ftp.expect('Password:')!=0:sys.exit()ftp.sendline(ftppw)if ftp.expect('230')!=0 or ftp.expect(prmpt)!=0:sys.exit()return ftp#获取服务器下文件下所有的文件
def get_server_files(ftp):ftp.sendline('ls')if ftp.expect('226')!=0:sys.exit()#文件列表filelsts=ftp.beforefilelsts=filelsts.split('\n')#匹配多个空格remtch=re.compile('\s+')filelsts=[remtch.subn('',item.strip('\r'))[0] for item in filelsts if 'group' in item]filedict=dict()for item in filelsts:datas=item.split('')filedict[datas[-1]]={'mon':mons.index(datas[-4])+1,'day':int(datas[-3]),'time':datas[-2]}return filedict#获得本地文件信息
def get_local_files():localfiles=os.listdir(cwd)localfilesdict=dict()for file in localfiles:t=time.ctime(os.stat(os.path.join(cwd,file)).st_mtime)#创建时间,修改时间datas=t.split()localfilesdict[file]={'mon':mons.index(datas[-4])+1,'day':int(datas[-3]),'time':datas[-2][:5]}return localfilesdict#文件同步到服务器
def sync_files(ftp,localfilesdict,filedict):#需要同步的文件addfile=[]for file in localfilesdict.keys():if file not in filedict:addfile.append(file)if file in filedict:if localfiledict[file]['mon']>filedict[file]['mon'] or localfiledict[file]['day']>filedict[file]['day'] or localfilesdict[file]['time']>filedict[file]['time']:addfile.append(file)#删除服务器上有但是本地没有的文件信息delfile=set(filedict.keys())-set(localfilesdict.keys())#上传文件if addfile:for f in addfile:ftp.sendline('put '+f)if ftp.expect(['226',pexpect.EOF])==0:print('Upload success:',f)else:sys.exit()#删除文件if delfile:for f in delfile:ftp.sendline('delete '+f)if ftp.expect(['250',pexpect.EOF])==0:print('Del:',f)else:print('Permission denied:')sys.exit()#退出ftp服务器
def exit_ftp(ftp):if ftp:ftp.sendcontrol('d')print(ftp.read().decode())if __name__=='__main__':mons=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')cwd='/home/acm506/桌面/python数据库'#服务器提示符prmpt=['ftp>',pexpect.EOF]#本机ipftps='192.168.1.167'#用户名匿名ftpuser='anoneymous'#ftpuser='hang'#ftppw='hang'ftppw='123'#登入ftp服务器ftp=login_ftp()#获取文件列表filedict=get_server_files(ftp)localfilesdict=get_local_files()#文件同步sync_files(ftp,localfilesdict,filedict)#退出服务器exit_ftp(ftp)#!/usr/bin/env python
#-*-coding:utf-8-*-
#测试网路window下
from pexpect.popen_spawn import PopenSpawn
import pexpect.popen_spawndef test_ip(ipaddr):child=PopenSpawn('cmd')child.sendline('ping %s' % ipaddr)child.sendline('exit')child.expect(pexpect.EOF)out=child.before.decode('gbk')per=out[:out.find('%')][-2:]per=[ch for ch in per if ch.isdigit()]per=int(''.join(per))if per>=100:print('网络不通!',ipaddr)elif 80>=per>=30:print('网络不稳定!',ipaddr)else:print('网络正常!',ipaddr)if __name__=='__main__':addrlst=['192.168.1.167','192.168.1.1','8.8.8.8']for ip in addrlst:test_ip(ip)#!/usr/bin/env python
#-*-coding:utf-8-*-
#写入python脚本
import pexpect.replwrapchild=pexpect.replwrap.python()print(child.run_command('2*1'))child=pexpect.replwrap.bash()
print(child.run_command('ls'))#!/usr/bin/env python
#-*-coding:utf-8-*-
#ssh命令连接远程
from pexpect.pxssh import pxssh
import getpasshostname='192.168.1.167'
user='root'
pw=getpass.getpass()
s=pxssh()
s.login(hostname,user,pw)
s.sendline('ls -l')
s.prompt()
print(s.before.decode())
#磁盘使用情况
s.sendline('df')
s.prompt()
print(s.before.decode())
s.sendline('poweroff')s.logout()
#!/usr/bin/env python
#-*-coding:utf-8-*-
#逐个登录制定的多台远程主机,监控远程主机并依据相关信息要求用户处理
#登录多台指定的远程主机
#获取远程主机的系统状态
#对远程主机状态进行检查
#远程主机状态良好则输出相关信息
#远程主机负载过重则显示其状态信息,并由用户选择是否进入交互模式处理,同时记录处理日志
#退出登录
from pexpect.pxssh import pxssh
import pexpect#登录远程
def login_host(host):s=pxssh()#连接远程if s.login(host[0],host[1],host[2]):return s#获取远程主机CPU数量
def get_cpus(sshc):#cpu信息sshc.sendline('cat /proc/cpuinfo')#匹配res=sshc.expect(['cpu cores.*\r\n'.pexpect.EOF])if res==0:#匹配结构data=sshc.after.decode().split('\r\n')#cpu数量data=data[0]data=data[data.index(':')+1:]#数量cpucores=int(data)sshc.prompt()return cpucores
#远程主机负载状况
def get_cpu_load(sshc):sshc.sendline('uptime')if sshc.prompt():data=sshc.before.decode()data=data.strip('\r\n')data=data[data.rfind(':')+1:]data=data.split(',')return (float(data[0]),float(data[1]),float(data[2]))#获取负载的信息
def get_cpu_stat(sshc):sshc.sendline('vmstat')sshc.prompt()print(sshc.before.decode())#登入用户后,处理一定的信息
def user_deal(host,logfilename):s=login_host(host)if not s:print('Login Failure:',host[0])returntry:#cpu的数量cpucores=get_cpus(s)if not cpucores:print('Do not get cpucores:',host[0])return cpu_load=get_cpu_load(s)if cpu_load[2]>=cpucores or 1:get_cpu_stat(s)print("System is not healthy.Do you want to deal?(yes/no)")yn=input()if yn=='yes':with open(logfilename,'ab+') as f:s.logfile=fs.interact()s.prompt()s.logfile=Noneelse:print('System is healthy:',host[0])except:print('Failure:',host[0])finally:s.logout()if __name__=='__main__':hosts=[('192.168.1.22','root','123'),]logfilename='log.txt'for host in hosts:user_deal(host,logfilename)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k-shingles和MinHash优秀文章保存

minhash原理解释:https://www.cnblogs.com/sddai/p/6110704.html k-shingles和minhash使用原理:https://blog.csdn.net/aspirinvagrant/article/details/41281101 代码java实现:https://blog.csdn.net/remoa_dengqinyi/article/details/728…

Python 数据库连接

#!/usr/bin/env python #-*-coding:utf-8-*- #异常处理,with的使用, class Mycontex(object):def __init__(self,name):self.namenamedef __enter__(self):print("__enter__")return selfdef do_self(self):print(do_self)def __exit__(self,e…

中文分词测试语句

研究生命科学研究生命令本科生我从马上下来我马上下来北京大学生喝进口红酒在北京大学生活区喝进口红酒从小学电脑从小学毕业美军中将竟公然说新建地铁中将禁止商业摊点这块地面积还真不小地面积了厚厚的雪让我们以爱心和平等来对待动物阿美首脑会议将讨论巴以和平等问题锌合金…

socket网络编程udp

#!/usr/bin/env python #-*-coding:utf-8-*- #udp socketserver客户端 import socketHOST127.0.0.1 PORT3214 ssocket.socket(socket.AF_INET,socket.SOCK_DGRAM)data你好! s.sendto(data.encode(utf-8),(HOST,PORT))while data!bye:datbwhile len(dat)0:dat,addrs.…

几种分类器小结

朴素贝叶斯分类器是假设数据样本特征完全独立,以贝叶斯定理为基础的简单概率分类器。AdaBoost算法的自适应在于前一个分类器产生的错误分类样本会被用来训练下一个分类器,从而提升分类准确率,但是AdaBoost算法对于噪声样本和异常样本比较敏感…

socket网络编程tcp

#!/usr/bin/env python #-*-coding:utf-8-*- #tcp 客户端import socketHOST127.0.0.1 POST3214ssocket.socket() try:s.connect((HOST,POST))data你好!while data:s.sendall(data.encode(utf-8))datas.recv(1024)print(Receive from Server:\n,data.decode(utf-8))d…

聚类算法篇章总结

主要的距离计算方法包括: 最短距离法(通过样本数值之间的距离计算,然后将距离值最小的样本进行合并的过程)最长距离法中间距离法重心法(重心聚类法:将两个聚类中心点的距离定义为两个类的重心距离,而类的重心为属于该类的样本的平…

socket网络编程多线程

#!/usr/bin/env python #-*-coding:utf-8-*- #多进程 import threading import time def thfun():s0for i in range(30):sitime.sleep(0.1)print(s)class MyThread(threading.Thread):def run(self):s0for i in range(30):sitime.sleep(0.1)print(s)if __name____main__:#ths[t…

学习之道

对待人生的任何事情都要:抓大放小,要事为先 对于一个以前从来没有接触过java的人,java无疑是庞大的,似乎每个领域都可以拓展开来都是一片开阔地,每一个领域要想深入接触到每一个细节所耗费的精力都是巨大的。这个时候大…

socket网络编程ftp

#!/usr/bin/env python #-*-coding:utf-8-*- #ftp客户端 import os import socket import threading import socketserver#下载文件 def get_file(host,port,filepath):ssocket.socket()s.connect((host,port))filepathos.path.join(.,bakc,filepath)fopen(filepath,wb)dataTr…

python类似于java的重写toString方法

python类中的特殊方法: __str__(self)用来重写 people类: class People:所有员工的基类#构造函数def __init__(self, user_id, user_name):self.user_id user_idself.user_name user_name#析构函数def __del__(self):class_name self.__class__.__n…

socket网络编程实现远程备份

#!/usr/bin/env python #-*-coding:utf-8-*- #GUI设计与构建 客户端建立from tkinter import * from tkinter.ttk import * import socket import struct#启动服务 def start(host,port):pass#我的控件 class MyFrame(Frame):def __init__(self,root):super().__init__(root)se…

python正则表达式使用

模板代码: import re #python 自1.5版本增加了re模块,它提供了Perl风格的正则表达式模式 print(re.match(www, www.baidu.com).span()) #在起初位置匹配 line "Cats are smarter than dogs" matchObj re.match( r(.*) are (.*?) .*, line,…

Q-学习,马克尔决策过程:强化学习

马尔可夫决策过程 马尔可夫决策过程是基于马尔可夫过程理论的随机动态系统的最优决策过程。马尔可夫决策过程是序贯决策的主要研究领域。它是马尔可夫过程与确定性的动态规划相结合的产物,故又称马尔可夫型随机动态规划,属于运筹学中数学规划的一个分支…

python对象使用

模板代码: class People:所有员工的基类#构造函数def __init__(self, user_id, user_name):self.user_id user_idself.user_name user_name#析构函数def __del__(self):class_name self.__class__.__name__print(class_name, 销毁)def get_info(self):print(&qu…

机器学习——决策树算法

机器学习——决策树算法原理及案例 标签: 机器学习决策树信息增益基尼指数模型评估 2016-05-04 15:31 43984人阅读 评论(1) 收藏 举报 分类: 机器学习(10) 版权声明:本文为博主原创文章,未经博主允许不…

python运算符重载

重载符模板代码: class Vector:def __init__(self, a, b):self.a aself.b bdef __str__(self):return Vector (%d, %d) % (self.a, self.b)def __add__(self, other):return Vector(self.a other.a, self.b other.b) v1 Vector(2, 10) v2 Vector(5, -2) prin…

机器学习——决策树的实现

#!/usr/bin/env python #-*-coding:utf-8-*- #决策树的建立,训练测试, from sklearn.feature_extraction import DictVectorizer import csv from sklearn import preprocessing from sklearn import tree from sklearn.externals.six import StringIO#读…

python练习代码保存

#codingutf-8 print(中国人) """ Python 保留字:and, exec, not, assert, finally, or, break, for, pass, class, from, print, continue, global, raise, def, if, return, del, import, try, elif, in, while, else, is, with, except, lambda, …