运维常用的python脚本

一、用Python写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径

#!/usr/bin/env python

import os

# 遍历/tmp目录及其子目录
for root, dirs, files in os.walk('/tmp'):
    # 遍历当前目录下的所有文件
    for name in files:
        # 打印文件的完整路径
        print(os.path.join(root, name))

os.walk()

原型为:os.walk(top, topdown=True, οnerrοr=None, followlinks=False)

我们一般只使用第一个参数。(topdown指明遍历的顺序)

  • os.walk('/tmp')会生成/tmp目录下所有文件和目录的路径
  • 对于每个目录,它返回一个三元组(root, dirs, files)
    • root是当前正在遍历的目录的路径
    • dirs是当前目录下的所有子目录的列表
    • files是当前目录下的所有文件的列表
  • os.path.join(root, name)用于将目录路径和文件名拼接成完整的文件路径

二、写程序打印三角形

普通三角形

#!/usr/bin/env python

# 使用Python 3的input函数并转换为整数
num = int(input('input number:'))

for i in range(1, num + 1):
    # 打印一行i个星号
    for j in range(i):
        print('*', end='')  # 不换行
    print()  # 每行结束后换行

等腰三角形:

#!/usr/bin/env python

# 获取用户输入的行数
rows = int(input('请输入等腰三角形的行数: '))

# 打印等腰三角形
for i in range(1, rows + 1):
    # 打印左侧空格
    for j in range(rows - i):
        print(' ', end='')
    # 打印星号
    for k in range(2 * i - 1):
        print('*', end='')
    # 换行
    print()

三、生成磁盘使用情况的日志文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import os

# 获取当前日期作为文件名
new_time = time.strftime('%Y-%m-%d')
log_filename = f"{new_time}.log"

# 获取磁盘状态信息
disk_status = os.popen('df -h').readlines()
str1 = ''.join(disk_status)

# 使用with语句操作文件,更安全且自动处理关闭
with open(log_filename, 'w', encoding='utf-8') as f:
    f.write(str1)
    # with语句会自动处理刷新和关闭,不需要显式调用flush()和close()

四、统计出每个IP的访问量有多少?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 不建议使用list作为变量名,因为它是Python的内置类型
ip_list = []

# 使用with语句更安全地处理文件操作
with open('/tmp/1.log', 'r', encoding='utf-8') as f:
    lines = f.readlines()

for line in lines:
    # 处理空行,避免索引错误
    if line.strip():
        ip = line.split()[0]
        ip_list.append(ip)

# 使用集合获取唯一IP
unique_ips = set(ip_list)

for ip in unique_ips:
    count = ip_list.count(ip)
    # 使用Python 3的print函数格式
    print(f"{ip} : {count}")

五、生成随机密码

# 调用随机数模块random
# string模块中的变量ascii_letters和digits中,定义了大小写字母和所有数字
import random
from  string import ascii_letters, digits
# 定义变量all_chs,存储密码的所有选择;
all_chs = ascii_letters + digits
# 使用def定义函数randpass(), 生成随机8位密码
def randpass(n=8):
    result = ''
    for i in range(n):
        ch = random.choice(all_chs)
        result += ch
    return result  # return给函数返回密码
# 测试代码块,__name__作为python文件调用时,执行代码块
if __name__ == '__main__':
    print(randpass(8))
    print(randpass(4))

六、比较文件内容

需求:
有两个文件:a.log 和 b.log
两个文件中有大量重复内容
取出只有在 b.log 中存在的行

# 定义变量,指定要操作的文件路径
fname1 = '/opt/a.log'
fname2 = '/opt/b.log'
 
# 将对象fobj1转换为集合类型(集合中的元素无序排列,且不会重复)
with open(fname1, mode="r") as fobj1:
    aset = set(fobj1.readlines())
 
# 将对象fobj2转换为集合类型(集合中的元素无序排列,且不会重复)
with open(fname2, mode="r") as fobj2:
    bset = set(fobj2.readlines())
 
print(bset - aset)

七、paramiko 实例(远程执行命令)

需求:
• 创建 SSHClient 实例
• 设置添加主机密钥策略
• 连接 ssh 服务器
• 执行指定命令
import paramiko
def rcmd(host, username, password, commands):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(
        paramiko.AutoAddPolicy())
    ssh.connect(host,
                username=username, password=password)
    data = ssh.exec_command(commands)
    # data[1]: 存储的是命令执行成功的输出信息
    # data[2]: 存储的是命令执行失败的错误信息
    log = data[1].read()
    err = data[2].read()
    if len(log) != 0:
        print("log:", log.decode(), end="")
    if len(err) != 0:
        print("err:", err.decode(), end="")
    ssh.close()
if __name__ == '__main__':
    ip = input("请输入您要操作的远程主机ip: ")
    username = input(f"请输入ip为:{ip}, 登录的用户名: ")
    password = input(f"请输入 {username} 对应的密码: ")
    cmds = input("请输入要执行的命令: ")
    rcmd(ip, username, password, cmds)

八、多线程编程

- subprocess.run() 方法可以调用系统命令,其返回值是系统命令退出码,也就是如果系统
命令成功执行,返回0,如果没有成功执行,返回非零值

import subprocess
import threading
def ping(host):
    result = subprocess.run(
        'ping -c2 %s &> /dev/null' % host,
        shell=True
    )
    if result.returncode == 0:
        print('%s: up' % host)
    else:
        print('%s: down' % host)
if __name__ == '__main__':
    ips = ['172.40.58.%s' % i for i in range(1, 255)]
    for ip in ips:
        # 创建线程,ping是上面定义的函数, args是传给ping函数的参数
        t = threading.Thread(target=ping, args=(ip,))
        t.start()  # 执行ping(ip)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值