[Python] 利用commands模块执行Linux shell命令

本文介绍了如何利用Python中的commands模块执行Linux shell命令,特别是通过commands.getoutput()和commands.getstatusoutput()来检测磁盘使用率,并在超过设定阈值时在磁盘使用信息中加入警告提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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调用ADB Shell执行自定义指令 为了实现这一目标,可以利用`subprocess`模块来运行ADB命令。此方法适用于多种操作系统环境下的Python脚本开发。 对于简单的ADB命令调用,可以直接构建命令字符串并通过`subprocess.run()`函数执行: ```python import subprocess command = "adb devices" result = subprocess.run(command.split(), capture_output=True, text=True) print(result.stdout.strip()) ``` 当需要传递更复杂的参数或希望连续执行多个ADB shell命令时,则应考虑采用如下方式处理: #### 构建并发送复合型ADB Shell命令序列 通过组合多条命令成单个字符串,并将其作为整体传入到ADB shell环境中去执行。这可以通过在各命令间加入分号`;`或者使用反引号包裹起来的方式达成[^1]。 ```python commands = """ input keyevent 26; # 锁屏操作 pm clear com.example.app; monkey -p com.example.app -v 500 """ output = subprocess.check_output(f"adb shell '{commands}'", shell=True).decode() print(output) ``` #### 利用Popen对象管理交互式会话 如果计划与远程设备建立长时间连接或是频繁交换数据的话,创建一个持久性的子进程可能是更好的选择。此时可借助于`Popen`类实例化一个新的进程对象,从而获得更大的灵活性和控制力[^3]。 ```python from subprocess import Popen, PIPE with Popen(["adb", "shell"], stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: outs, errs = proc.communicate(input=b'ls /\nexit\n') print(outs.decode()) ``` 上述代码片段展示了怎样开启一次新的ADB shell session,在其中依次发出列出根目录文件列表(`ls /`)以及退出当前session(`exit`)两条命令。 需要注意的是,每当涉及到跨平台兼容性问题时——比如在同一套源码基础上分别部署至Linux/macOS同Windows之上——应当谨慎对待路径分隔符差异等因素的影响;另外就是确保所使用的Python版本支持这些API特性[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值