Python2.x利用commands模块执行Linux shell命令


Posted in Python onMarch 11, 2016

用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数:

1. commands.getoutput('shell command')

执行shell命令,返回结果(string类型)

>>> commands.getoutput('pwd')

'/home/oracle'

2. commands.getstatus('file')

该函数已被python丢弃,不建议使用,它返回 ls -ld file 的结果(String)(返回结果太奇怪了,难怪被丢弃)

>>> commands.getstatus('admin.tar')

'-rw-rw-r-- 1 oracle oracle 829440 Jan 29 10:36 admin.tar'

3. commands.getstatusoutput('shell command')

执行shell命令, 返回两个元素的元组tuple(status, result),status为int类型,result为string类型。

cmd的执行方式是{ cmd ; } 2>&1, 故返回结果包含标准输出和标准错误.

>>> commands.getstatusoutput('pwd')

(0, '/home/oracle')

下面的一个脚本利用commands模块检测磁盘使用率,标识出大于10%的磁盘(百分比可根据实际情况调整,一般设为90%,本例为了更好的说明情况,设为10%):

import commands
threshold = 10
flag = False
title=commands.getoutput("df -h|head -1")
'''
Check sda disk space usage like below format:
/dev/sda2 20G 2.3G 17G 13% /
/dev/sda6 20G 306M 19G 2% /var
/dev/sda3 49G 2.8G 44G 7% /home
/dev/sda5 49G 4.5G 42G 10% /opt
/dev/sda1 194M 12M 172M 7% /boot
'''
chkDiskList=commands.getoutput("df -h|grep sda").split('\n')
usedPercents=commands.getoutput("df -h|grep sda|awk '{print $5}'|grep -Eo '[0-9]+'").split('\n')
for i in range(0,len(usedPercents)):
if int(usedPercents[i]) >= threshold:
chkDiskList[i] += ' ----Caution!!! space usage >= ' + str(threshold)
flag = True
'''
Check disk space usage like below format:
/dev/mapper/backup-backup_lv
751G 14G 699G 2% /backup
/dev/mapper/data-data_lv
751G 172G 540G 25% /data
''' 
chkDiskList_2=commands.getoutput("df -h|grep -v sda|grep -v tmp|grep -v system").split('\n')
usedPercents_2=commands.getoutput("df -h|grep -v map|grep -v sda|grep -v tmp|grep -v system|awk '{print $4}'|grep -Eo '[0-9]+'").split('\n')
for i in range(0,len(usedPercents_2)): 
if int(usedPercents_2[i]) >= threshold:
chkDiskList_2[i*2 + 1] += ' ----Caution!!! space usage >= ' + str(threshold)
flag = True
if flag == True:
#combine tile, chkDiskList, chkDisklist_2
result = [title,]
result.extend(chkDiskList)
result.extend(chkDiskList_2)
for line in result:
print line

假设当前的磁盘使用率如下:

[oracle@lx200 ~/admin/python]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 2.3G 17G 13% /
/dev/sda6 20G 306M 19G 2% /var
/dev/sda3 49G 2.8G 44G 7% /home
/dev/sda5 49G 4.5G 42G 10% /opt
/dev/sda1 194M 12M 172M 7% /boot
tmpfs 18G 0 18G 0% /dev/shm
/dev/mapper/backup-backup_lv
751G 14G 699G 2% /backup
/dev/mapper/data-data_lv
751G 174G 539G 25% /data

执行该脚本后的结果如下:

Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 2.3G 17G 13% / ----Caution!!! space usage >= 10
/dev/sda6 20G 306M 19G 2% /var
/dev/sda3 49G 2.8G 44G 7% /home
/dev/sda5 49G 4.5G 42G 10% /opt ----Caution!!! space usage >= 10
/dev/sda1 194M 12M 172M 7% /boot
/dev/mapper/backup-backup_lv
751G 14G 699G 2% /backup
/dev/mapper/data-data_lv
751G 174G 539G 25% /data ----Caution!!! space usage >= 10

python Commands模块 使用方法

要获得shell命令的输出只需要`cmd`就可以了,
需要得到命令执行的状态则需要判断$?的值, 在Python中有一个模块commands也很容易做到以上的效果.

看一下三个函数:

1). commands.getstatusoutput(cmd)

用os.popen()执行命令cmd, 然后返回两个元素的元组(status, result). cmd执行的方式是{ cmd ; } 2>&1, 这样返回结果里面就会包含标准输出和标准错误.

2). commands.getoutput(cmd)

只返回执行的结果, 忽略返回值.

3). commands.getstatus(file)

返回ls -ld file执行的结果.

看一下这些函数使用的例子:

>>> import commands
>>> commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> commands.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> commands.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
>>> commands.getoutput('ls /bin/ls')
'/bin/ls'
>>> commands.getstatus('/bin/ls')
'-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'
Python 相关文章推荐
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
python解析基于xml格式的日志文件
Feb 25 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
简单了解python高阶函数map/reduce
Jun 28 Python
Django继承自带user表并重写的例子
Nov 18 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
Keras搭建自编码器操作
Jul 03 Python
如何查看python关键字
Jan 17 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
Python实现列表转换成字典数据结构的方法
Mar 11 #Python
python中enumerate函数遍历元素用法分析
Mar 11 #Python
python实现class对象转换成json/字典的方法
Mar 11 #Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 #Python
深入学习python的yield和generator
Mar 10 #Python
Python中random模块生成随机数详解
Mar 10 #Python
python生成器表达式和列表解析
Mar 10 #Python
You might like
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python里运用私有属性和方法总结
2019/07/08 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
精通CAD能手自荐书
2014/01/31 职场文书
秋季运动会广播稿
2014/02/22 职场文书
节约用水标语
2014/06/11 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
2015年新学期寄语
2015/02/26 职场文书
2016公司年会通知范文
2015/04/25 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
九年级化学教学反思
2016/02/22 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python