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中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
python使用Tesseract库识别验证
Mar 21 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
Python绘制热力图示例
Sep 27 Python
Python3批量创建Crowd用户并分配组
May 20 Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 Python
python中的错误如何查看
Jul 08 Python
分享一个python的aes加密代码
Dec 22 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
Python如何解决secure_filename对中文不支持问题
Jul 16 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
56.com视频采集接口程序(PHP)
2007/09/22 PHP
用php实现批量查询清除一句话后门的代码
2008/01/20 PHP
PHP setTime 设置当前时间的代码
2012/08/27 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
python友情链接检查方法
2015/07/08 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
普通PHP程序员笔试题
2016/01/01 面试题
学期自我鉴定范文
2013/10/01 职场文书
计算机个人求职信范例
2014/01/24 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
新闻人物通讯稿
2014/10/09 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
导游带团欢迎词
2015/09/30 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
工厂无线对讲系统解决方案
2022/02/18 无线电
golang的文件创建及读写操作
2022/04/14 Golang
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers