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