linux系统AI问答与命令执行

编写PYTHON脚本

[root@cmdb ~]# cat ollama_query.py
#!/usr/bin/env python3
import requests
import json
import sys
import subprocess

# Ollama API 地址
OLLAMA_URL = "http://172.30.64.110:11434/api/generate"

# Linux 系统运维专用提示词模板
LINUX_SYSADMIN_PROMPT = """
你是一个经验丰富的 Linux 系统管理员助手。
用户会提出与 Linux 系统运维相关的问题,请你返回一个**可以直接执行的 Linux 命令**,不要解释,不要多余内容。

要求:
- 只输出命令,不要解释或说明
- 如果有多种命令可选,用换行分隔
- 不要使用任何 Markdown 格式
- 如果无法确定命令,请返回 "No suitable command found."

用户问题:
{user_prompt}
"""

def query_ollama(model_name, prompt):
    data = {
        "model": model_name,
        "prompt": prompt,
        "stream": False
    }

    try:
        response = requests.post(OLLAMA_URL, json=data)
        response.raise_for_status()
        result = response.json()
        return result.get("response", "").strip()
    except requests.exceptions.RequestException as e:
        return f"Error occurred: {e}"

def execute_commands(commands):
    """执行一组命令"""
    if not commands:
        print("没有可执行的命令。")
        return

    print("正在执行命令...")
    for cmd in commands.split('\n'):
        cmd = cmd.strip()
        if not cmd:
            continue
        print(f"\n$ {cmd}")
        try:
            # 兼容 Python 3.6 的写法
            output = subprocess.run(
                cmd,
                shell=True,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                check=True,
                universal_newlines=True  # 替代 text=True
            )
            print(output.stdout)
        except subprocess.CalledProcessError as e:
            print(f"命令执行失败:{e}")
            print(e.stderr)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("请提供提问内容,例如:")
        print("ai \"查看所有运行中的服务\"")
        sys.exit(1)

    # 解析参数
    user_prompt = sys.argv[1]
    auto_exec = "--exec" in sys.argv

    # 使用增强提示词模板
    prompt = LINUX_SYSADMIN_PROMPT.format(user_prompt=user_prompt)

    model = "qwen2:7b"  # 或你本地使用的模型名,如 llama3、mistral 等

    print(f"提问内容:{user_prompt}")
    print("正在从 Ollama 获取命令...")
    commands = query_ollama(model, prompt)

    if not commands or "No suitable command found." in commands:
        print("没有找到合适的命令。")
    else:
        print("获取到以下命令:")
        print("-" * 50)
        print(commands)
        print("-" * 50)

        if auto_exec:
            confirm = input("是否要执行以上命令?(y/n): ").strip().lower()
            if confirm == 'y':
                execute_commands(commands)
            else:
                print("取消执行。")

命令别名

[root@cmdb ~]# cat .bashrc 
alias ai='python3 ollama_query.py'

测试

[root@cmdb ~]# ai "通过docker部署mysql5.7,对外端口是3306" --exec
提问内容:通过docker部署mysql5.7,对外端口是3306
正在从 Ollama 获取命令...
获取到以下命令:
--------------------------------------------------
docker run -d --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword mysql:5.7
--------------------------------------------------
是否要执行以上命令?(y/n): y
正在执行命令...

$ docker run -d --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword mysql:5.7
72d56c83a95e51114885a801f22f1bd35a0bfc2f5f34775821038e3a37ebfa63