一:sys模块

# 导入sys模块
import sys

# 查看当前使用的pyhon解释器版本
print(sys.version)

# 查看当前使用的pyhon的版本信息
print(sys.versioninfo)
      
# 查看当前使用的python的主版本号
py_version = sys.version_info
print(py_version.major)
      
# 当前使用机器的系统版本
print(sys.platform)
windows --->win32
Mac ---> darwin
Linux ---> linux

Python运维 python运维常用模块_linux

# python 脚本中的参数打印,类似于shell中的$1,$2....
import sys
print(sys.argv)
print("第一个参数:{}".format(sys.argv[1]))
print("第二个参数:{}".format(sys.argv[2]))
# 第一个参数为脚本文件本身,后面的参数依次1,2,3.....

__file__:该方法会打印出当前工作目录的绝对路径,返回的是一个字符串。
print(__file__)

Python运维 python运维常用模块_python_02

os模块

# 导入os模块
import os
# 获取当前工作目录,即当前python脚本工作的目录路径
print(os.getcwd())

# 切换当前脚本工作目录,相当于shell中的cd
os.chdir("{path}")

# 创建单机目录,相当于shell中的mkdir dirname
os.mkdir("{dir_name}")

# 获取指定目录下的文件
os.listdir("{path}")

# 获取当前目录的上一级目录
print(os.path.dirname(__file___))
print(os.path.dirname(os.path.abspath(__file__)))
# 二者的区别:打印出来的路径的分隔符不同,前一种是符合手写的,后一种是符合windows路径的

Python运维 python运维常用模块_shell_03

glob模块

# 该模块可以在指定的路径下,以模糊匹配的方式查找文件,* 代表0到多个字符,即正则表达式中的.*
import glob
glob.glob("*.py")

time和datetime模块

# 获取时间的操作模块
import time
time.strftime("{pattern}")	 # pattern 指定时间显示格式
time.strftime("%F")			# 只输出日期,即年 月 日
time.strftime("%T")			# 只输出时间,即小时 分钟 秒
# 获取当前时间(时间戳形式)
print(time.time())
# 获取当前时间(结构化形式)
print(time.localtime())
# 获取当前时间(格式化字符串形式)
print(time.srtftime("%F %T"))

# 自我理解时间戳格式时间转化为字符串格式时间
需要将时间戳格式的时间转换为字符串的话,首先需要转换为结构化的时间格式,然后再进行转换为字符串格式的事时间。
因此格式为:
time.strftime("%F %T",time.localtime(时间戳格式的时间))
将时间戳格式的时间作为参数传入到localtime()函数中,然后将该函数的执行结果作为strftime()的参数传入,最后就变为了字符串格式的时间输出。
# 字符串格式时间转化为时间戳格式时间
time.mktime(time.strptime("str_time","%Y-%m-%d...."))
time.mktime():参数为结构化格式的时间
time.strptime():参数1:为字符串格式的时间  参数2:字符串时间格式的表示%Y %m %d ...等

Python运维 python运维常用模块_shell_04

datetime 时间计算

import datetime
# 三天后的现在的时间
datetime.datetime.now() + datetime.timedelta(3)
# 30分钟后
datetime.datetime.now() + datetime.timedelta(minutes=30)
# 三天前
datetime.datetime.now() - datetime.timedelta(3)


# 时间格式转换:
使用datetime.datetime.now() 函数输出的时间为结构化格式的时间,需要转化为字符串格式的时间输出;
方法:
datetime.datetime.strftime(datetime.datetime.now(),"%F %T....")
第一个参数为:能够输出结构化格式时间的内容
第二个参数为:输出为字符串格式的时间的的格式

subprocess模块

# 模块介绍
# subprocess模块主要用于创建子进程,并连接他们的输入、输出和错误管道,获取它们的返回状态。
# 通俗的理解:可以在python的代码中执行一些操作系统级别的命令,“ip a”、“du -sh”等
# subprocess模块替代了一些老的模块和函数,
# 比如:os.system、os.spawn*

# subprocess过去版本中的call(),check_call()和check_output()已经被run()方法取代了。
# run()方法为3.5版本新增。
# 推荐使用run()方法调用子进程,执行操作系统命令
# 在更高级的使用场景,你还可以使用Popen接口
subprocess.run(args, *, stdin=None, input=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None)
run() # 方法的返回值,表示一个进程结束了
args  # 启动进程的参数,通常是个列表或字符串
returncode  # 进程结束状态返回码。0表示成功状态
stdout	# 获取子进程的stdout(标准输出)。通常为bytes类型序列,None表示没有捕获值。如果你在调用run()方法时,设置了参数stderr=subprocess.STDOUT,则错误信息会和stdout一起输出,此时stderr的值是None。
stderr	#  获取子进程的错误信息(错误输出)。通常为bytes类型序列,None表示没有捕获值
check_returncode() # 用于检查返回码。如果返回状态码不为0,弹出CalledProcessError异常。
subprocess.DEVNULL # 一个特殊值,用于传递给stdout、stdin和stderr参数。表示使用os.devnull作为参数值。
subprocess.PIPE    # 管道,可传递给stdout、stdin和stderr参数。
subprocess.STDOUT # 特殊值,可传递给stderr参数,表示stdout和stderr合并输出。

案例:使用python脚本执行linux命令

import subprocess


def run_test(command):
    return_status = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                   encoding="utf-8",
                                   timeout=1)
    if return_status.returncode == 0:
        print("return is success:", return_status)
    else:
        print("return is error:", return_status)


run_test(["ls", "/tmp"])  # 序列参数
run_test("exit 1")  # 字符串参数
# 这里有一个注意点,不知道为什么,当执行创建文件的命令的时候,例如:touch、mkdir 的时候,需要将命令写成一个字符串,作为参数传入自定义的函数中才可以。
run_test("touch [path]")
# 所有的命令都可以这样调用,不需要传列表形式
Popen方法
# Popen()方法是subprocess模块中的核心,子进程的创建和管理都靠它处理
常用参数:
# args:shell命令,可以是字符串或者序列类型(如:list,元组)
# bufsize:缓冲区大小。当创建标准流的管道对象时使用,默认-1。 0:不使用缓冲区 1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式 正数:表示缓冲区大小 负数:表示使用系统默认的缓冲区大小。
# stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
# preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
# shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
# cwd:用于设置子进程的当前目录。
# env:用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承。

# 使用该方法调用linux系统命令
import subprocess
subprocess.Popen("ls -l ./",shell=True) # 注意shell=True必须要有,否则执行不了
Popen 对象方法(即使用Popen方法返回值的接收变量)
# poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
# wait(timeout): 等待子进程终止。
# communicate(input,timeout): 和子进程交互,发送和读取数据。(类似于标准输出,元组类型)
该方法类似于run方法中的stdout(),都是返回的结果数据
# send_signal(singnal): 发送信号到子进程 。
# terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
# kill(): 杀死子进程。发送 SIGKILL 信号到子进程。

paramiko模块

模块简介:paramiko模块连接远程服务器可以使用远程服务器的用户名,密码进行登陆,进行操作

执行linux命令
方法1
远程连接进行执行linux上的命令,并且打印出返回结果

import paramiko
'''
该模块可以实现远程登录系统进行命令操作,并返回命令执行结果的标准输出、错误输出等、
同时可以使用sftp的方法进行上传下载文件、
也可以在线进行文件的修改
'''
# 创建一个SSHClient对象
ssh = paramiko.SSHClient()

# 将信任的主机加到host_allow列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
ssh.connect("192.168.127.140",22,"root","root")

# 定义变量接收返回的数据
stdin,stdout,stderr = ssh.exec_command("ls -l /root")
# 分别接收标准输入,标准输出,错误输出
'注意:这里接收参数必须按照这个顺序进行排列接收,否则程序执行会出错'

# 打印出标准输出
print(stdout.read().decode('utf-8'))
方法2
# 实例化transport对象
transport = paramiko.Transport(("192.168.127.140",22))

# 建立连接
transport.connect(username="root",password="root")

# 将sshclient的对象的transport指定为以上的transport
ssh = paramiko.SSHClient()
ssh._transport = transport

# 执行命令,和传统方法一样(接收必须是stdin,stdout,sterr = ssh.exec_command("command") 的形式 否则会报错)
stdin,stdout,stderr = ssh.exec_command("df -h")

# 接收命令结果
out,err = stdout.read(),stderr.read()

# 判断是否不为空,out不为空即打印out,否则打印err
result = out if out else err
print(result.decode("utf-8"))

# 关闭连接
transport.close()

sftp上传下载文件

# 导入模块
import paramiko

# 实例化一个transport对象
# 第一个参数为远程服务器的IP地址,第二个参数为服务端口,一般为22
transport = paramiko.Transport(IP,port)

# 建立连接
# 第一个参数为用户名,第二个参数为密码
transport.connect(username="username",password="password")
'注意:这里必须是使用 key="value"的形式进行,传参数,否则会报错'

# 实例化sftp客户端对象
sftp = paramiko.SFTPClient,from_transport(transport)

# 通过sftp调用下载命令
sftp.get(source,target,print("下载成功。"))
# 第一个参数为,需要下载的文件在服务器上的绝对路径(指定到文件名)
# 第二个参数,下载的文件保存到本地的路径(指定到文件名)


# 通过sftp调用上传命令
sftp.put(source,target,print("上传成功。"))
# 第一个参数:需要上传的文件在本地的绝对路径(相对路径也可以,容易出错)
# 第二个参数:需要上传的文件在远程服务器上保存的地址(都需要指定到文件名)

服务器文件修改

def write_server_file(hostname, username, password, open_mode, data, path, port=22):
    # 创建ssh客户端对象
    ssh_client = paramiko.SSHClient()

    # 将远程主机的地址添加到本地的host_allow 文件中
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # 建立连接
    ssh_client.connect(hostname=hostname, port=port, username=username, password=password)

    # 创建ftp数据传输实例对象
    ftp = ssh_client.open_sftp()

    # 判断用户想要什么方式打开文件w(写入)或者a(追加)
    if open_mode == "w":
    # 创建文件操作实例对象,并且打开文件
    file_object = ftp.open(path, open_mode)
    # 第一个参数:远程服务器中,需要进行修改的文件的绝对路径
    # 第二个参数:打开该文件的方式,这里是以写的方式打开(文件存在,即打开文件,从头开始写入(覆盖文件原有内容),不存在则创建文件,从头开始写入)

    # 执行写入操作
    file_object.write(data)

    elif open_mode == "a":
    file_object = ftp.open(path, open_mode)
    file_object.write(data)

    else:
    print("请输入正确的打开模式,a(追加)或者w(写入)")

查看目录下的所有文件(类似于linux中的ls命令)

def shell_ls(hostname,username,password,path,port=22):
    # 创建ssh客户端实例对象
    ssh = paramiko.SSHClient()

    # 添加远程主机名到本地host_allo文件中
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # 建立连接
    ssh.connect(hostname=hostname, port=port, username=username, password=password)

    # 创建ftp实例对象
    ftp = ssh.open_sftp()

    # 使用for循环打印出对应目录下的所有文件或者目录
    for file_name in ftp.listdir(path=path):
        print(file_name)
paramiko模块总结
其中一共有4个使用场景
1、远程连接,执行linux系统命令 #(实例化ssh客户端对象或者transport对象2种代码书写方式)
2、实现本地机器和远程服务器之间,文件的上传下载操作 #(实例化transport对象1种代码书写方式)
3、实现对远程主机的文件修改操作(追加和覆盖写入)# (实例化ssh客户端对象 1种代码书写方式)
4、实现类似于执行ls命令结果的操作(查看指定目录下的文件)# (实例化ssh客户端的对象 1种代码书写方式)