找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1|回复: 0

大模型初始化Linux系统

[复制链接]

39

主题

27

回帖

218

积分

管理员

积分
218
发表于 1 小时前 | 显示全部楼层 |阅读模式
在当今数字化信息时代,网络安全与系统性能的重要性日益凸显。Linux 操作系统以其开源、稳定、高效等诸多优势,成为众多服务器和网络设备的首选操作系统。然而,新部署的 Linux 系统往往默认开启了许多不必要的端口、服务和配置信息,这不仅会消耗大量系统资源,还会增加系统遭受攻击的风险,影响系统在高并发场景下的性能表现。

为了让 Linux 系统在保障安全的同时,能高效稳定地运行,我们可以借助自动化脚本与先进的豆包大模型,构建一套智能化的系统优化方案。下面为你详细介绍该方案的具体操作流程:

我们要编写一个自动化脚本。这个脚本的主要任务是与豆包大模型的 API 接口建立连接。在连接之前,脚本会收集当前 Linux 系统的详细信息,比如系统的版本、已安装的软件包、正在运行的服务、开放的端口等。这些信息就像是系统的 “健康档案”,能让豆包大模型全面了解系统的现状。

接着,脚本将收集到的系统信息通过 API 接口发送给豆包大模型。豆包大模型拥有强大的数据分析和决策能力,它就像一位经验丰富的系统专家,能够对这些信息进行深入分析。大模型会综合考虑系统的安全性、性能优化以及高并发场景下的运行需求,判断出哪些端口、服务和配置信息是不必要的,并给出具体的优化建议。

豆包大模型会将这些优化建议通过 API 接口返回给脚本。这些建议可能包括关闭某些不必要的服务、禁用一些默认开启但当前系统不需要的端口,以及修改一些不合理的配置参数等。

脚本会根据豆包大模型返回的建议,自动对 Linux 系统进行优化和初始化操作。对于不必要的服务,脚本会使用相应的命令将其停止并禁止开机自启,例如对于 CentOS 系统,可以使用systemctl stop和systemctl disable命令。对于不需要开放的端口,脚本会通过防火墙规则进行关闭,像使用iptables或firewalld来限制端口的访问。同时,脚本还会自动修改系统配置文件,移除或调整那些可能影响系统性能和安全的配置信息。

脚本会对优化后的系统进行简单的检查,确保各项操作都已正确执行,系统没有出现异常。并且,为了保证系统的稳定性和性能,脚本还会提供操作记录和日志,方便后续的查看和问题排查。

通过这样一套自动化的优化方案,我们可以充分利用豆包大模型的智能分析能力,快速、准确地找出 Linux 系统中存在的潜在问题,并及时进行优化和初始化。这不仅能有效提升系统的安全性,降低被攻击的风险,还能显著提高系统在高并发场景下的性能表现,为用户提供更加稳定、高效的服务。同时,这种自动化的方式大大减少了人工操作的繁琐和失误,提高了系统管理的效率和准确性。

此处将使用 Python 3 编写,因此需要确保你的服务器上已经安装了 Python 3。可以使用以下命令检查 Python 版本:

python3 --version



安装Python requests 库用于发送 HTTP 请求,是脚本中与模型 API 进行交互的关键库。可以使用以下命令安装:

mkdir -p ~/.pip && echo -e "[global]\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple\n[install]\ntrusted-host = pypi.tuna.tsinghua.edu.cn" > ~/.pip/pip.conf



pip install requestspip install psutil



编写Python脚本代码,如下所示:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import requests

import os

import json

import time

import threading

import sys

import subprocess

import re

import signal

# ===================== 七牛大模型配置 =====================

API_KEY = "sk-aab9187dbe9990b5bb92ee6c2945a5619d0f06b00831135d083a0a0a0e50005e"

API_URL = 'https://api.qnaigc.com/v1/chat/completions'

MODEL_NAME = "qwen-turbo"

# =========================================================

# 全局变量,用于控制进度提示线程

stop_progress = False

# 定义需要保留的服务和端口

ALLOWED_SERVICES = ['ssh', 'nginx', 'dbus', 'systemd-journald', 'polkit', 'NetworkManager', 'systemd-hostnamed', 'systemd-logind', 'systemd-udevd']

ALLOWED_PORTS = [22, 80, 443]

# 定义无效的服务名

INVALID_SERVICES = ['UNIT', 'LOAD', 'ACTIVE', 'SUB']

# 定义拒绝手动停止的服务

REFUSE_MANUAL_STOP_SERVICES = ['auditd']

# 定义要关闭的特定服务

SERVICES_TO_CLOSE = ['dhcpd', 'nfs', 'bind', 'vsftpd', 'named']

# 定义特定服务对应的端口

SERVICE_PORT_MAPPING = {

'dhcpd': [67, 68],

'nfs': [2049],

'bind': [53],

'vsftpd': [20, 21],

'named': [53]

}

def handle_ctrl_c(signum, frame):

print("\n\n🛑 检测到 Ctrl+C,程序正常退出!")

sys.exit(0)

signal.signal(signal.SIGINT, handle_ctrl_c)

# 新增:检查系统命令是否存在

def check_command_exists(cmd):

"""检查系统命令是否存在,避免执行不存在的命令报错"""

try:

subprocess.run([cmd, '--version'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

return True

except FileNotFoundError:

print(f"\033[31m警告:系统缺少 {cmd} 命令,相关功能可能无法正常执行!\033[0m")

return False

except Exception:

return True

def get_current_services_and_ports():

"""获取当前正在运行的服务和监听的端口"""

try:

services = get_running_services()

ports = get_listening_ports()

return services, ports

except Exception as e:

print(f"获取服务和端口信息失败: {e}")

return [], []

def get_running_services():

"""获取当前正在运行的服务"""

if not check_command_exists('systemctl'):

return []

try:

result = subprocess.run(

['systemctl', 'list-units', '--type=service', '--state=running', '--no-pager', '--plain'],

capture_output=True, text=True, timeout=10

)

output = result.stdout

services = []

for line in output.splitlines():

parts = line.split()

if len(parts) > 0:

service = parts[0].replace('.service', '')

if service not in INVALID_SERVICES and service.strip():

services.append(service)

return list(set(services))

except subprocess.TimeoutExpired:

print("获取运行中服务超时")

return []

except Exception as e:

print(f"获取运行中服务失败: {e}")

return []

def get_listening_ports():

"""获取当前正在监听的端口"""

if not check_command_exists('ss'):

return []

try:

result = subprocess.run(

['ss', '-tuln', '--no-header'],

capture_output=True, text=True, timeout=10

)

output = result.stdout

ports = []

for line in output.splitlines():

parts = line.split()

if len(parts) > 4:

address_port = parts[4].split(':')

if len(address_port) > 1:

try:

port = int(address_port[-1])

ports.append(port)

except ValueError:

pass

return list(set(ports))

except subprocess.TimeoutExpired:

print("获取监听端口超时")

return []

except Exception as e:

print(f"获取监听端口失败: {e}")

return []

def progress_indicator():

"""进度转圈提示"""

global stop_progress

symbols = ['-', '\\', '|', '/']

index = 0

while not stop_progress:

symbol = symbols[index % len(symbols)]

sys.stdout.write(f"\r正在请求大模型分析无用服务与端口,请耐心等待... {symbol}")

sys.stdout.flush()

time.sleep(0.2)

index += 1

sys.stdout.write("\r请求完成,已接收AI优化建议\n")

def get_optimized_suggestions(services, ports):

"""调用AI获取关闭不必要服务和端口的建议"""

headers = {

'Authorization': f'Bearer {API_KEY}',

'Content-Type': 'application/json'

}

prompt = f"""当前系统正在运行的服务有:{', '.join(services)},正在监听的端口有:{', '.join(map(str, ports))}。

要求:

1. 仅返回可以关闭的不必要服务名和端口号,英文逗号分隔;

2. 必须排除保留服务:{', '.join(ALLOWED_SERVICES)} 和保留端口:{', '.join(map(str, ALLOWED_PORTS))};

3. 只返回纯列表,不要任何解释、标题、注释;

4. 服务名不带.service后缀,端口仅输出数字。

示例输出:dhcpd,nfs,67,68"""

data = {

"model": MODEL_NAME,

"messages": [

{"role": "system", "content": "Linux安全运维专家,严格遵守输出格式,只返回逗号分割的服务与端口列表。"},

{"role": "user", "content": prompt}

]

}

try:

print("正在向大模型请求无用服务/端口清理建议...")

global stop_progress

stop_progress = False

progress_thread = threading.Thread(target=progress_indicator)

progress_thread.start()

response = requests.post(API_URL, headers=headers, json=data, timeout=120)

stop_progress = True

progress_thread.join()

response.raise_for_status()

response_data = response.json()

content = response_data["choices"][0]["message"]["content"]

# 剥离代码块标记

block_reg = re.compile(r'```(?:txt|shell)?(.*?)```', re.DOTALL)

match = block_reg.search(content)

if match:

return match.group(1).strip()

return content.strip()

except requests.RequestException as e:

stop_progress = True

progress_thread.join()

print(f"\033[31mAPI请求出错: {e}\033[0m")

return None

except Exception as e:

stop_progress = True

progress_thread.join()

print(f"\033[31m解析响应异常: {e}\033[0m")

return None

def parse_suggestions(suggestions):

"""解析模型返回的建议"""

services_to_stop = []

ports_to_close = []

if not suggestions:

return services_to_stop, ports_to_close

items = suggestions.split(',')

for item in items:

item = item.strip().replace(' ', '')

if not item:

continue

if re.match(r'^\d+$', item):

try:

port = int(item)

if port not in ALLOWED_PORTS and 1 <= port <= 65535:

ports_to_close.append(port)

except ValueError:

pass

elif item not in INVALID_SERVICES and item not in ALLOWED_SERVICES and item not in REFUSE_MANUAL_STOP_SERVICES:

services_to_stop.append(item)

return list(set(services_to_stop)), list(set(ports_to_close))

def stop_unnecessary_services(services_to_stop):

"""停止不必要的服务"""

if not check_command_exists('systemctl'):

return [], []

stopped_services = []

skipped_services = []

devnull = open(os.devnull, 'w')

print(f"\n准备停止以下服务: {', '.join(services_to_stop)}")

for service in services_to_stop:

if service in ALLOWED_SERVICES:

print(f"跳过保留服务: {service}")

continue

if service in REFUSE_MANUAL_STOP_SERVICES:

print(f"拒绝停止受保护服务: {service}")

skipped_services.append(service)

continue

try:

check = subprocess.run(

['systemctl', 'is-active', f'{service}.service'],

capture_output=True, text=True, timeout=5

)

if check.returncode != 0:

continue

subprocess.run(

['systemctl', 'stop', f'{service}.service'],

stdout=devnull, stderr=devnull, timeout=10

)

subprocess.run(

['systemctl', 'disable', f'{service}.service'],

stdout=devnull, stderr=devnull, timeout=10

)

stopped_services.append(service)

print(f"✅ 成功停止并禁用服务: {service}")

except subprocess.TimeoutExpired:

print(f"⏱️ 停止服务 {service} 超时")

except Exception as e:

print(f"❌ 停止服务 {service} 失败: {e}")

devnull.close()

return stopped_services, skipped_services

def check_firewalld_status():

"""检查 firewalld 是否运行"""

if not check_command_exists('firewall-cmd'):

return False

try:

result = subprocess.run(

['systemctl', 'is-active', 'firewalld'],

capture_output=True, text=True, timeout=5

)

return result.stdout.strip() == 'active'

except Exception as e:

print(f"检查firewalld状态失败: {e}")

return False

def close_unnecessary_ports(ports_to_close, services_to_stop):

"""防火墙关闭多余端口"""

if not check_command_exists('firewall-cmd'):

print("缺少firewall-cmd命令,无法操作防火墙端口")

return []

closed_ports = []

if 'firewalld' in services_to_stop:

print("firewalld即将停止,跳过端口操作")

return closed_ports

if not check_firewalld_status():

devnull = open(os.devnull, 'w')

print("firewalld未启动,进行启动与开机自启配置")

subprocess.run(['systemctl', 'start', 'firewalld'], stdout=devnull, stderr=devnull, timeout=10)

subprocess.run(['systemctl', 'enable', 'firewalld'], stdout=devnull, stderr=devnull, timeout=10)

devnull.close()

devnull = open(os.devnull, 'w')

print(f"\n准备防火墙关闭端口: {', '.join(map(str, ports_to_close))}")

for port in ports_to_close:

if port in ALLOWED_PORTS:

print(f"跳过保留端口: {port}")

continue

try:

subprocess.run(['firewall-cmd', '--permanent', '--remove-port', f'{port}/tcp'], stdout=devnull, stderr=devnull)

subprocess.run(['firewall-cmd', '--permanent', '--remove-port', f'{port}/udp'], stdout=devnull, stderr=devnull)

subprocess.run(['firewall-cmd', '--reload'], stdout=devnull, stderr=devnull)

closed_ports.append(port)

print(f"✅ 防火墙移除端口: {port}")

except Exception as e:

print(f"❌ 关闭端口 {port} 失败: {e}")

devnull.close()

return closed_ports

def close_specific_services_and_ports():

"""强制清理预设危险服务"""

running_services = get_running_services()

stopped_services = []

closed_ports = []

devnull = open(os.devnull, 'w')

print(f"\n处理预设待关闭服务列表: {', '.join(SERVICES_TO_CLOSE)}")

for service in SERVICES_TO_CLOSE:

if service not in running_services:

print(f"服务 {service} 未运行,跳过")

continue

try:

subprocess.run(['systemctl', 'stop', f'{service}.service'], stdout=devnull, stderr=devnull, timeout=10)

subprocess.run(['systemctl', 'disable', f'{service}.service'], stdout=devnull, stderr=devnull, timeout=10)

stopped_services.append(service)

print(f"✅ 成功停止预设服务: {service}")

except Exception as e:

print(f"❌ 停止服务 {service} 失败: {e}")

if service in SERVICE_PORT_MAPPING:

for port in SERVICE_PORT_MAPPING[service]:

if port in ALLOWED_PORTS:

continue

try:

subprocess.run(['firewall-cmd', '--permanent', '--remove-port', f'{port}/tcp'], stdout=devnull, stderr=devnull)

subprocess.run(['firewall-cmd', '--permanent', '--remove-port', f'{port}/udp'], stdout=devnull, stderr=devnull)

subprocess.run(['firewall-cmd', '--reload'], stdout=devnull, stderr=devnull)

closed_ports.append(port)

print(f"✅ 防火墙移除预设端口: {port}")

except Exception as e:

print(f"❌ 端口 {port} 操作失败: {e}")

devnull.close()

return stopped_services, closed_ports

def summarize_results(

api_suggestions,

api_stopped_services,

api_skipped_services,

api_closed_ports,

specific_stopped_services,

specific_closed_ports

):

"""输出执行汇总信息"""

filtered_suggestions = []

if api_suggestions:

services_to_stop, ports_to_close = parse_suggestions(api_suggestions)

filtered_suggestions.extend(services_to_stop)

filtered_suggestions.extend(map(str, ports_to_close))

print("\n" + "="*60)

print("📋 系统服务与端口清理 执行结果汇总")

print("="*60)

print("1. AI分析建议(过滤后):")

if filtered_suggestions:

print(f" → {', '.join(filtered_suggestions)}")

else:

print(" → 无有效清理建议")

print("\n2. 根据AI建议执行结果:")

if api_stopped_services:

print(f" ✅ 已停止服务:{', '.join(api_stopped_services)}")

else:

print(" - 未停止任何服务")

if api_skipped_services:

print(f" ⚠️ 受保护跳过服务:{', '.join(api_skipped_services)}")

if api_closed_ports:

print(f" ✅ 防火墙关闭端口:{', '.join(map(str, api_closed_ports))}")

else:

print(" - 未关闭任何端口")

print("\n3. 预设强制清理列表执行结果:")

if specific_stopped_services:

print(f" ✅ 已停止服务:{', '.join(specific_stopped_services)}")

else:

print(" - 无匹配运行服务")

if specific_closed_ports:

print(f" ✅ 防火墙关闭端口:{', '.join(map(str, specific_closed_ports))}")

else:

print(" - 无端口变更")

print("="*60)

def main():

print("================ Linux系统无用服务&端口安全清理工具 ================")

check_command_exists('systemctl')

check_command_exists('ss')

check_command_exists('firewall-cmd')

try:

services, ports = get_current_services_and_ports()

print(f"\n当前运行服务: {', '.join(services)}")

print(f"当前监听端口: {', '.join(map(str, ports))}")

suggestions = get_optimized_suggestions(services, ports)

api_stopped_services = []

api_skipped_services = []

api_closed_ports = []

specific_stopped_services = []

specific_closed_ports = []

if suggestions:

services_to_stop, ports_to_close = parse_suggestions(suggestions)

print(f"\nAI解析待处理服务:{', '.join(services_to_stop)}")

print(f"AI解析待处理端口:{', '.join(map(str, ports_to_close))}")

api_stopped_services, api_skipped_services = stop_unnecessary_services(services_to_stop)

api_closed_ports = close_unnecessary_ports(ports_to_close, services_to_stop)

specific_stopped_services, specific_closed_ports = close_specific_services_and_ports()

summarize_results(suggestions, api_stopped_services, api_skipped_services, api_closed_ports,

specific_stopped_services, specific_closed_ports)

except Exception as e:

print(f"\033[31m脚本执行异常: {e}\033[0m")

sys.exit(1)

print("\n🏁 全部任务执行完成!")

if __name__ == "__main__":

main()

使用豆包大模型需要登录火山引擎平台去创建应用、获取API秘钥,操作的方法和步骤如下:

#注册并登录火山引擎平台

访问火山引擎官网,点击右上角 “注册” 按钮,按照提示完成注册流程。注册方式可以选择手机号、邮箱等,完成注册后登录平台。

#开通大模型服务

登录后,在控制台页面,通过搜索框搜索 “大模型”,或者在产品与服务列表中找到 “大模型” 服务并进入。

若你是首次使用该服务,系统会提示你开通,按照引导完成开通操作。开通过程中可能需要进行实名认证等步骤,请根据系统提示完成。

#创建应用

进入大模型服务控制台后,通常在左侧导航栏中找到 “应用管理” 选项并点击进入。

#在应用管理页面,点击 “创建应用” 按钮。

填写应用信息:

应用名称:为你的应用取一个有意义的名称,方便识别和管理,例如 “Nginx 配置建议应用”。

#应用描述:简要描述该应用的用途,如 “用于根据 Nginx 并发连接数获取 worker_processes 建议值”。

选择模型:根据你的需求选择合适的大模型,例如可以选择豆包模型。

填写完成后,点击 “确定” 按钮,系统会创建一个新的应用。

#获取 API Key 和 Secret Key

应用创建成功后,在应用管理列表中找到你刚创建的应用,点击该应用名称进入应用详情页。

在应用详情页中,你可以看到 “API Key” 和 “Secret Key”,这两个密钥用于调用大模型 API 时进行身份验证。注意,Secret Key 只会在首次创建应用时显示一次,请妥善保存。





通过如上Python脚本+doubao大模型,即可实现自动调整Linux内核配置文件参数,脚本测试如图所示:python3 doubao_init_system.sh



懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表