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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
详解Python中for循环的使用
Apr 14 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
详解python执行shell脚本创建用户及相关操作
Apr 11 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
详解BeautifulSoup获取特定标签下内容的方法
Dec 07 Python
详解如何用Python实现感知器算法
Jun 18 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.ini中文版
2006/10/09 PHP
javascript 函数使用说明
2010/04/07 Javascript
IE6图片加载的一个BUG解决方法
2010/07/13 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
python2.7到3.x迁移指南
2018/02/01 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
python实现kmp算法的实例代码
2019/04/03 Python
python print出共轭复数的方法详解
2019/06/25 Python
pytorch之添加BN的实现
2020/01/06 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
神路信息Java面试题目
2013/03/31 面试题
阿尔卡特(中国)的面试题目
2014/08/20 面试题
若干个Java基础面试题
2015/05/19 面试题
大学生职业生涯规划书模版
2013/12/30 职场文书
工程售后服务方案
2014/06/08 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
公司演讲稿开场白
2014/08/25 职场文书
中班下学期个人总结
2015/02/12 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers