Python 运维

时间:2022-02-18 14:42:02

1.python解释器提供提供的小工具

1.1 一秒钟启动一个下载服务器
  进入要下载文件的目录(shift+鼠标右键可以很快的在当前目录打开一个cmd)
  python2:  python2 -m SimpleHTTPServer   (python2中的模块,在python3中已经整合到http.server模块中)
  python3:  python -m http.server
  
  其原理是打开了一个python中内置的web服务器,类似于FTP,默认端口为8000,如果存在index.html则会打开此文件,如果不存在则显示当前目录下的文件列表

1.2 快速转化json字符串为json对象(linux系统中)
  $ echo '{"links":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]}' | python -m json.tool

1.3 检查第三方库是否正确安装
   使用import paramiko
   批量检查:python -c "import paramiko"

2.python中pip高级用法

2.1 pip介绍  pip是最流行的包管理工具。    pip功能强大,支持安装和卸载,期对手easy_install则只支持安装,pip可以很好的支持虚拟环境,可以通过requirements.txt集中管理依赖,能够处理二进制格式(.whl),pip是先下载后安装,如果安装失败,也会清理干净  python2中是pip,python3中是pip32.2 pip常用命令  升级    pip install -U pip  查找安装包    pip search paramiko  安装特定版本的包    pip install paramiko==0.2.8  删除安装包    pip uninstall paramiko  查看安装包信息    pip show paramiko  查看安装包的依赖是否完整    pip check paramiko  查看已安装包的列表    pip list   到处系统已安装包的列表到requirements文件  可以到其他服务器上直接安装软件    pip freeze > d:\requirements.txt  从requirements文件中安装    pip install -r requirements.txt   使用pip补全    pip completion --bash >> ~/.profile    $source ~/.profile

2.3 pip加速安装技巧  pip的下载地址是在pypi.python.org,有点饿时候特别慢,也不稳定,如果要使用国内第三方的源,就能提高下载速度,只需要在下载的时候添加-i参数即可    pip install -i http://pypi.douban.com/simple/ paramiko

  也可以将软件下载到本地部署,通过这中下载会将软件的所有依赖包也下载到本地(离线下载的时二进制包)    pip install --download=="test" -r requirements.txt  从requirements.txt中下载包到test下  本地安装    pip install --no-index -f(-find-links) file://'test' -r requirements.txt       

 3.python的工作环境

pyenv:用于管理不同的python的版本
virtualenv:用于管理不同的工作环境

4.python os,sys模块(跨平台)

判断一个文件是否存在,如果不存在,则提示,如果存在,则判断文件是否可读

import sys                                           #导入模块
import os
def test():
    sys.argv.append(" ")                              #向argv列表中添加一个空元素,如果在执行时忘记添加参数,而又没有第一个元素的话,程序会报错
    filename = sys.argv[1]                           #将argv中的下标为1的元素赋值给filename
    if not os.path.isfile(filename):                 #通过os模块中path子模块中的isfile判断文件是否存在
        raise SystemExit(filename + '  不存在哦')     #如果不存在,则打印文件不存在
    elif not os.access(filename,os.R_OK):            #如果存在的话则通过os模块的access子模块判断是否可读
        raise SystemExit(filename + '  不可以读写')    #如果可读,则打印危机爱你可以读写
    else:
        print (filename + '  可以读写')
if __name__ == '__main__':
    test()

执行结果E:\python 20>python json.py json.py  ['json.py', 'json.py']                            #是打印argv列表元素  json.py  可以读写
sys.argv:是sys库下面的列表,该列表保存了所有的命令行参数,其中下标为0的元素是执行文件的名字,其余的参数已字符串的形式保存在该列表中      此列表可以从终端接收无数个参数,而存放在列表当中,如果没有第一个参数的话,程序会报错,而无法执行,所以在argv中添加一个空元素,当python json.py test.txt有参数的时候,test.txt就成了argv的第一个元素
os.path.isfile(filename):判断文件是否存在os.access(path,mode):判断文件是否可读raise:python中的异常处理,当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行

python使用stdin和fileinput读取标准输入

从所周知,shell脚本有一个所有语言都没有的有点,那就是管道,通过管道符,我们可以使用多个简单的命令来实现一个复杂的功能。因此,我们希望在Python中使用管道来结合Python语言和shell语言的优势(通过管道来将shell语言和Python语言一起使用

在Python标准库sys中有三个文件描述符分别是:stdin(标准输入 0,指的是通过<或者|来传递数据),stdout(标准输出 1),stderr(标准错误 2)。通过标准输入结合管道,就不需要通过open()函数来打开文件了。

1.使用sys库中的stdin读取内容(linux中的标准输入)  windows   创建 tes_sys_stdin.py文件     import sys     name = sys.stdin.readline()     print (name)  linux:  创建 test_sys_stdin.py文件    import sys    for line in sys.stdin():    print (line)
    执行test_sys_stdin.py文件:      cat /etc/passwd | python test_sys_stdin.py      python test_sys_stdin.py < /etc/passwd
  也可以通过stdin.readlines()函数将标准输入的内容读取到一个列表里面

   sys.stdin.readline( )会将标准输入全部获取,包括末尾的'\n',因此用len计算长度时是把换行符'\n'算进去了的,但是input( )获取输入时返回的结果是不包含末尾的换行符'\n'的。
   因此如果在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符.
   可以用strip( )函数(sys.stdin.readline( ).strip('\n'))或sys.stdin.readline( )[:-1]这两种方法去掉换行。

2.使用fileinput标准库读取内容(普通的读取文件)  fileinput()可以进行多文件的处理,使用fileinput可以读取命令行给出的多个文件,也就是说fileinput会便利argv[1:]列表,并按行一次读取列表中的文件,如果该列表为空,则fileinput默认读取标准输入的内容  创建sys_fileinput.py文件  windows:    import fileinput    for line in fileinput.input(files=('123','456')):  #读取文件      print(line)  linux:    import fileinput    for line in fielinput.input():      print (line)    执行方法:      cat /etc/passwd |python  sys_fileinput.py      python sys_fileinput.py   /etc/passwd      python sys_fileinput.py  /etc/passwd  /etc/hosts
     fileinput()方法:    print (fileinput.filename())    #当前正在读取的文件名    print (fileinput.fileno())      #文件描述符    print (fileinput.filelineno())  #正在读取的行是当前文件的第几行    print (fileinput.isfirstline()) #正在读取的行是否是当前文件的第一行    print (fileinput.isstdin())     #正在读取文件还是直接从标准输入中读取内容

3.使用stdout和stderr向标准输出和标准错误中输入信息  import os  sys.stdout.write("标准输出") 等价于 print('标准输出')  sys.stderr.write("标准错误")

  在python中调用print时,事实上调用了sys.stdout.write(obj+'\n')
  print 将需要的内容打印到控制台,然后追加一个换行符。

 5.使用getpass读取密码

import getpass
user = getpass.getuser()                     #linux/windows获取到的用户都是当前用户
passwd = getpass.getpass('your password:')   #用户输入的密码不在控制台上显示,但是pycharm有个小bug,不能实现这个函数
print (user,passwd)

6.python管理Linux系统(os,sys标准库进阶,跨平台)

在管理Linux系统很多情况下就是在对文件进行管理,这是因为UNIX及其衍生物Linux中:一切都被看作是文件!!如:普通文件,硬盘,sockect接口,链接符号,命名管道,甚至目录都被看成是一个文件,档把所有东西都看成是文件以后,一个显著的优点就是:可以在输入和输出资源上使用同一组Linux工具,程序和Api。

1.文件读写    文件可以从多个维度进行管理:文件重命名,获取文件属性,判断文件是否存在,备份文件,读写文件,打包解压等等。    在python读取文件只需要通过内置函数open来打开文件即可,open函数接受文件名称和打开模式作为参数,返回一个文件对象,操作完文件之后,通过文件对象的close方法关闭即可    info = open('456',encoding='utf-8')    #要加上编码方式,读取到info文件对象里面    print(info.read())                     #通过info文件对象的read方法读取文件的所有内容,并打印    info.close()                           #关闭这个文件对象        open函数默认以"r"的方式打开,也可以知道那个文件的打开模式      r:默认以读的方式打开,如果文件不存在,抛出FileFoundError异常      w:以写模式打开,如果文件非空,则已有的内容将会被覆盖,如果文件不存在,将创建文件并写入      a:在文件末尾追加数据的方式写入      x:创建一个新文件,如果文件存在,则抛出FileExisError异常      r+:可读写文件。可读;可写;可追加      w+:写读      U:表示在读取时,可以将\r\n自动转换成 \n (与 r 或 r+ 模式同使用, rU或者r+U)      b:表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)        open函数的其他方法      info.close() #关闭文件      info.flush() #刷新缓冲区,将缓冲区的数据立即写入到文件      info.isatty() #判断文件是否连接到终端设备,返回bool值      info.read(10) #读取文件前10个字符,从文件中读取指定的字符数,默认读取全部      info.readline(3)) #读取前3个字符,默认每次最多读取一行数据,每行的最后包含换行符'\n'      info.readlines()  #将文件存入到列表中,列表中的么一行就是文件中的每一行      info.readable     #判断文件是否可读,返回布尔值      info.seek(3)      #移动文件读取的指针,如果文件中包含中文,移动指针必须是3的倍数,不然会报错,因为一个中文字符等于3个字节      info.seekable     #判断文件指针是否可用,返回布尔值      info.tell()       #获取指针位置      info.truncate()   #截断,把指针后面的内容删除,并写入文件,要在可写模式下操作        f = open('text.txt','r+',encoding='utf-8')        f.seek(9)     #把指针移动到第9个字节后面(即第3个中文后面)        f.truncate()  #把第3个中文后面的字符删除,并写入文件        f.close()      info.writable()   #判断文件是否可写,返回布尔值      info.write()      #把字符串写入文件,并返回字符数      info.writelines() #写一个字符串列表到文件    

    在计算机中,每打开一个文件就需要占用一个文件句柄,而一个进程拥有的文件句柄是有限的,并且文件句柄也会占用操作系统的资源,所以,在打开文件以后要及时关闭文件,避免文件句柄泄露      1.可以使用finally关闭文件句柄,并且在什么情况是都会关闭(但是不提倡,因为python提倡优美,简洁)        try:          info = open("test.txt",encoding='utf-8')          peint(info)        finally:          info.close()
      2.使用上下文管理器(会打开文件,然后自动关闭,不用close函数)        with open('data.txt',encoding='utf-8') as info:          print(info.read())

    如何读取大文件?       使用上下文管理器和for循环,因为for循环不仅可以遍历如字符串,列表,元祖等可迭代序列,还可以使用可迭代协议来便利迭代对象,文件对象就实现了可迭代协议        with open('data',encoding='utf-8') as info:          for line in info:            print(line.upper())

    使用print语句也可以将数据写入到文件      with open ("456","a+",encoding="utf-8") as info:        print(1,2,'hello,world',sep='\n',file=info)
 2.文件与文件路径管理    python标准库中的os模块对操作系统的api进行了封装,并且使用同一个api接口来管理不同的操作系统的相同功能。    os模块包含与操作系统的系统环境,系统变量,系统文件,用户数据库以及权限进行交换的函数    2.1 os模块      os模块中包含两个比较常用的函数        os.getcwd()  #获取当前绝对路径        os.listdir() #列出当前目录下的文件和文件夹    2.2 os.path详解(用来对文件和文件路径进行管理)      拆分路径        os.path.split()   #返回一个二元组,包含文件路径和文件名        os.path.dirname()  #返回文件的路径        os.path.basename() #返回文件名        os.path.splitext() #返回一个去处扩展名部分和扩展名的二元组          import os          path = "/root/p0st/h/error.log"          print(os.path.split(path))       --->('/root/p0st/h', 'error.log')          print(os.path.dirname(path))     --->/root/p0st/h          print(os.path.basename(path))    --->error.log          print(os.path.splitext(path))    --->('/root/p0st/h/error', '.log')      构建路径        os.path.expanduser('~')#返回当前输入用户的家目录,必须得加~或~adm等指定用户        os.path.abspath()      #返回文件或路径的绝对路径        os.path.path()         #根据不同的操作系统,使用不同的路径分隔符拼接路径          import os           print(os.path.expanduser('~adm')) --->/var/adm          print(os.path.abspath('456'))       --->E:\oldboy\python 20\456          print(os.path.join(os.path.expanduser('~'),'123','456.txt'))   --->/var/adm/123/456.txt

        判断一个路径是否为绝对路径          import os          os.path.isabs(os.path.join(os.path.expanduser('~adm'),'123','456.txt')) --->True

        查看当前文件名字需要使用__file__这个特殊变量:当前代码所在的源文件          import os          path = os.path.abspath(__file__)          print(path)   --->/var/adm/123/456.py          print(os.path.abspath(os.path.join(os.path.dirname(path),os.path.pardir)))  -->/var
        获取文件属性和判断文件类型          import os          path= os.path.abspath(__file__)          print(os.path.getatime(path))   #获取当前文件的访问时间          print(os.path.getctime(path))   #获取当前文件的创建时间          print(os.path.getmtime(path))   #获取当前文件的修改时间          print(os.path.getsize(path))    #获取当前文件的大小
           print(os.path.exists(path))              #判断当前路径是否存在          print(os.path.isfile(path))              #参数所指的路径存在,并且是一个文件          print(os.path.isdir(path))               #参数所所指的路径存在,并且是一个目录          print(os.path.islink(path))              #。。。。。。。并且是一个链接          print(os.path.ismount(path))             #。。。。。。。并且是一个挂载点
        使用os模块管理文件和目录          os.remove(path)/unlink(path): 删除path所指的文件          os.rmdir(path)/removedirs(path) : 删除path所指向的目录,该文件夹必须为空,否则报错。          os.mkdir(path):创建一个文件夹          os.rename('olddir','newdir'):修改一个文件夹的名字                使用os模块来修改和判断文件权限          os.chmod(filename,0777) #修改文件权限          os.access(filename,os.R_OK)#判断文件权限---> os.R_OK:是否可读, os.W_OK:是否可写, os.X_OK:是否可执行                  
"""
通过命令行读取文件名称,如果文件存在,则查看是否能执行,不能的话修改权限为777,如果可执行的话就打印输出文件内容,如果文件不在,则提示文不存在
"""
# _*_ encoding:utf-8 _*_
import os
import sys

sys.argv.append('')
file_name = sys.argv[1]
def read_file():
    if not os.path.isfile(file_name):
        raise SystemExit(file_name + " 文件不存在")
    elif os.access(file_name,os.X_OK):
        with open(file_name) as info:
            print(info.read())
    else:
        os.chmod(file_name,0777)
        print("已修改为0777")
if __name__ == '__main__':
    read_file()

列子一

"""
打印最常用的十条linux命令
"""
#_*_ encoding:utf-8 _*_
import os
from collections import Counter

c = Counter()
with open(os.path.expanduser('~/.bash_history')) as cmd_info:
for line in cmd_info:
cmd = line.strip().split()
if cmd:
c[cmd[0]]+=1
print(c.most_common(10))

列子二

 7.python运维常用模块

1、psutil是一个跨平台库(https://github.com/giampaolo/psutil)
能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系统资源及进程的管理。

2、IPy(http://github.com/haypo/python-ipy),辅助IP规划。

3、dnspython(http://dnspython.org)Python实现的一个DNS工具包。

4、difflib:difflib作为Python的标准模块,无需安装,作用是对比文本之间的差异。

5、filecmp:系统自带,可以实现文件,目录,遍历子目录的差异,对比功能。

6、smtplib:发送电子邮件模块

7、pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现,功能强大,支持的协议有:FTP,HTTP,HTTPS,TELNET等,可以理解为Linux下curl命令功能的Python封装。(PS:PycURL在前几天的文章里有提及过)

8、XlsxWriter:操作Excel工作表的文字,数字,公式,图表等。

9、rrdtool:用于跟踪对象的变化,生成这些变化的走走势图

10、scapy(http://www.wecdev.org/projects/scapy/)是一个强大的交互式数据包处理程序,它能够对数据包进行伪造或解包,包括发送数据包,包嗅探,应答和反馈等功能。

11、Clam Antivirus免费开放源代码防毒软件,pyClamad,可以让Python模块直接使用ClamAV病毒扫描守护进程calmd。

12、pexpect:可以理解成Linux下expect的Python封装,通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的。

13、paramiko是基于Python实现的SSH2远程安装连接,支持认证及密钥方式。可以实现远程命令执行,文件传输,中间SSH代理等功能。相对于Pexpect,封装的层次更高,更贴近SSH协议的功能,官网地址:http://paramiko.org(依赖:Crypto,Ecdsa,Python开发包python-devel)

14、fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行,文件上传,下载及完整执行日志输出等功能。Fabric在paramiko的基础上做了更高一层的封装,操作起来更加简单。官网地址:http://www.fabfile.org(依赖setuptools,Crypto,paramiko包支持)

15、CGIHTTPRequestHandler实现对CGI的支持。

16、ansible(http://www.ansibleworks.com/)一种集成IT系统的配置管理,应用部署,执行特定任务的开源平台。基于Python实现,由Paramiko和PyYAML两个关键模块构建。Ansibl与Saltstack最大的区别是Ansible无需在被控主机上部署任何客户端,默认直接通过SSH通道进行远程命令执行或下发功能。

17、YAML:是一种用来表达数据序列的编程语言。

18、playbook:一个非常简单的配置管理和多主机部署系统。

19、saltstack(http://saltstack.com)是一个服务器基础架构集中化管理平台,一般可以理解为简化版的puppet和加强版的func。Saltstack基于Python语言实现,结合轻量级消息队列ZeroMQ,与Python每三方模块(Pyzmq,PyCrypto,Pyjinja2,python-msgpack和PyYAML等)构建。

20、func,为解决集群管理,监控问题需设计开发的系统管理基础框架。

 8.python分布式框架

Celery - 分布式任务队列

web