Linux命令可以在系统中,直接在终端调用执行,也可以在本地或远程服务器通过编程方式调用执行Linux的shell命令,本文主要介绍Python中本地或远程服务器执行Linux的shell命令。

1、Python 本地服务器执行Linux的shell命令

1)os.system

使用os.system只是在一个子终端运行系统命令,而不能获取命令执行后的返回信息。如下,

import os
result = os.system('cat /etc/passwd')
print(result)

2)os.popen

如要控制台输出的内容,则可以使用os.popen的方法,popen返回的是一个file对象,与open打开文件操作类似。如下,

import os

# popen返回文件对象,和open操作差不多
f = os.popen("cat /etc/passwd", "r")

d = f.read()  # 读文件
print(d)
print(type(d))
f.close()

3)使用模块 subprocess

import subprocess
def localExecute(command):
    p = subprocess.Popen([command],
                         stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE, shell=True)
    out = p.stdout.read().decode('utf-8')
    print(out)

if __name__ == '__main__':
    localExecute("cat /etc/passwd")

2、Python 远程服务器执行Linux的shell命令

paramiko是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。可以方便的进行ssh连接和sftp协议进行sftp文件传输。

1)安装paramiko模块

pip3 install paramiko

2)paramiko使用代码

import paramiko
# 远程登陆Linux服务器,并在服务器上执行命令
def remoteSsh(sys_ip, username, command, password=''):
    try:
        # 创建ssh客户端
        client = paramiko.SSHClient()
        # 第一次ssh远程时会提示输入yes或者no
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        if len(password) == 0:
            key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa")#免密登陆
            client.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20)
        else:
            client.connect(sys_ip, 22, username=username, password=password, timeout=20)#密码登陆
        print(f"开始在远程服务器上执行指令:{command}")
        # 执行查询命令
        stdin, stdout, stderr = client.exec_command(f"""{command}""", get_pty=True)
        # 获取查询命令执c行结果,返回的数据是一个list
        result = stdout.read().decode('utf-8')
        print(f"{sys_ip}执行结果:", result)

        error = stderr.read().decode('utf-8')
        if error != "":
            print(f"{sys_ip}错误信息:", error)
        else:
            pass
    except Exception as e:
        print(e)
    finally:
        client.close()

# 多台服务器批量执行同一命令
def batchExecuteRemoteCommand(host_list, command):
    import threading
    thread_list = []
    for ip, username, password in host_list:
        thread = threading.Thread(target = remoteSsh, args = (ip,username,password,command))
        thread_list.append(thread)#将生成的线程添加到列表里
    for t in thread_list:
        t.start() #开始执行线程
    for t in thread_list:
        t.join() #挂起线程,到所有线程结束

if __name__ == '__main__':
    batchExecuteRemoteCommand(('192.168.31.21','root','Aa123456'),'cat /etc/passwd')

推荐文档