6

Python3使用subprocess执行shell命令

 2 years ago
source link: https://chegva.com/4793.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Python3使用subprocess执行shell命令

  • 生产实践:

    调用阿里云aliyun、腾讯云tccli客户端命令获取云服务器磁盘信息

  • 学习技巧:

   Python subprocess库、阿里云、腾讯云API使用

  • 脚本内容:      

将云服务器机器名写入文件中,使用subprocess库执行本地shell命令调用api获取云服务器磁盘信息,需本地提前安装好阿里云aliyun、腾讯云tccli客户端。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
 @FileName:    diskinfo.py
 @Function:    使用subprocess执行shell命令获取阿里云、腾讯云机器磁盘信息
 @Author:      Zhihe An
 @Site:        https://chegva.com
 @Time:        2021/8/29
"""
 
from threading import Thread
import subprocess
import queue
import time
 
num_threads=3
q = queue.Queue()
host_list = []
with open('tmp', 'r') as f:
    lines = f.readlines()
    for l in lines:
        l = l.strip('\n').strip()
        host_list.append(l)

def diskinfo(host, queue):
   while True:
      host = queue.get()
      # ret=subprocess.call('tccli cvm DescribeInstances  --Filters \'[{"Name":"instance-name","Values":["%s"]}]\' --filter "InstanceSet[*]"|jq -r \'.[].DataDisks[0]["DiskSize"],.[].DataDisks[0]["DiskType"]\' | xargs;' % ip,shell=True,stdout=open('result','a'),stderr=subprocess.STDOUT)
      file = open('disk.txt', "a")
      if str(host).startswith('ali'):
         ins_name = subprocess.run('aliyun ecs DescribeInstances --RegionId cn-beijing --InstanceName "%s" | jq -r \'.[].Instance[0]["InstanceId"]\'' % host, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False)
         # bytes转成字符串
         ins_id = (ins_name.stdout.decode('utf-8').strip('\n').strip())
         # print(ins_id)
         time.sleep(0.5)
         if ins_id != 'null':
            disk_res = subprocess.run('aliyun ecs DescribeDisks --RegionId cn-beijing --InstanceId "%s" --DiskType data |jq -r \'.[]|.["Disk"][0]["Size"],.[][0]["Category"]\' | xargs' % ins_id, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False)
            disk_size_category = disk_res.stdout.decode('utf-8').strip('\n').strip()
         else:
            disk_size_category = ""
         print(host, disk_size_category)
         print(host, disk_size_category, file=file)
         # file.write(host + "\t" + disk_size_category + "\n")
         time.sleep(0.5)
      elif str(host).startswith('qc'):
         qc_res = subprocess.run('tccli cvm DescribeInstances  --Filters \'[{"Name":"instance-name","Values":["%s"]}]\' --filter "InstanceSet[*]"|jq -r \'.[].DataDisks[0]["DiskSize"],.[].DataDisks[0]["DiskType"]\' | xargs;' % host, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE, check=False)
         qc_disk = qc_res.stdout.decode('utf-8').strip()
         if qc_disk:
            print(host, qc_disk)
            print(host, qc_disk, file=file)
         else:
            print(host, qc_disk)
            # print(host, qc_disk, file=file)
            file.write("\n")
         # file.write(host + "\t" + qc_disk + "\n")
         time.sleep(0.5)
      else:
         print(host)
         # print(host, file=file)
         file.write("\n")
      file.close()
      queue.task_done()
 
#start num_threads threads
for i in range(num_threads):
   t=Thread(target=diskinfo,args=(i,q))
   t.setDaemon(True)
   t.start()

print('main thread waiting...')
for host in host_list:
   q.put(host)
   q.join()
print('Done')
Python

◎查看效果

Python3使用subprocess执行shell命令

参考:

安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/4793.html | ☆★★每天进步一点点,加油!★★☆ | 

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK