From ec53b50fd431f8532f1da108f399d28734b786bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=9F=B3=E7=9F=B3?= Date: Wed, 10 Dec 2025 17:58:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=80=9A=E8=BF=87=E7=BB=9D=E5=AF=B9?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=BD=BF=E7=94=A8=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base_tools/network_tools/base.py | 25 +++++++++-- .../mcp_tools/base_tools/ssh_fix_tool/base.py | 43 +++++++++++++++---- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py index 4ac62a739..2ab1f4ecc 100644 --- a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py @@ -1,10 +1,12 @@ import logging +import os import subprocess from typing import Dict, Optional, List import paramiko -from config.public.base_config_loader import BaseConfig, LanguageEnum +from config.base_config_loader import BaseConfig, LanguageEnum + logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) @@ -54,6 +56,16 @@ def _open_ssh(remote_auth: Dict) -> paramiko.SSHClient: return ssh +def _find_cmd_absolute_path(cmd: str) -> Optional[str]: + """查找命令的绝对路径(兼容特殊情况)""" + common_paths = ["/usr/bin", "/bin", "/usr/sbin", "/sbin", "/usr/local/bin"] + for path in common_paths: + cmd_path = os.path.join(path, cmd) + if os.path.exists(cmd_path) and os.access(cmd_path, os.X_OK): + return cmd_path + return None + + def _build_fix_command() -> str: """ 构造修复 ifcfg-ens3 中 BOOTPROTO 并重启 NetworkManager 的命令 @@ -62,6 +74,11 @@ def _build_fix_command() -> str: 2. 设置 BOOTPROTO=dhcp 3. systemctl restart NetworkManager """ + # 查找命令的绝对路径 + sed_path = _find_cmd_absolute_path("sed") or "sed" + grep_path = _find_cmd_absolute_path("grep") or "grep" + systemctl_path = _find_cmd_absolute_path("systemctl") or "systemctl" + ifcfg_path = "/etc/sysconfig/network-scripts/ifcfg-ens3" parts: List[str] = [] # 确认配置文件存在 @@ -74,14 +91,14 @@ def _build_fix_command() -> str: ) # 规范化 BOOTPROTO 行:若存在则直接替换为 dhcp parts.append( - "sed -i -e 's/^[#]*[[:space:]]*BOOTPROTO=.*/BOOTPROTO=dhcp/' \"$IFCFG\"" + f"{sed_path} -i -e 's/^[#]*[[:space:]]*BOOTPROTO=.*/BOOTPROTO=dhcp/' \"$IFCFG\"" ) # 若不存在 BOOTPROTO 行,则追加一行 parts.append( - "grep -q '^[[:space:]]*BOOTPROTO=' \"$IFCFG\" || echo 'BOOTPROTO=dhcp' >> \"$IFCFG\"" + f"{grep_path} -q '^[[:space:]]*BOOTPROTO=' \"$IFCFG\" || echo 'BOOTPROTO=dhcp' >> \"$IFCFG\"" ) # 重启 NetworkManager 服务 - parts.append("systemctl restart NetworkManager") + parts.append(f"{systemctl_path} restart NetworkManager") return " && ".join(parts) diff --git a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py index 1d06d15e4..64943ecd9 100644 --- a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py @@ -1,11 +1,12 @@ import logging +import os import socket import subprocess from typing import Dict, Optional, List import paramiko -from config.public.base_config_loader import BaseConfig, LanguageEnum +from config.base_config_loader import BaseConfig, LanguageEnum logger = logging.getLogger(__name__) @@ -62,7 +63,26 @@ def ssh_port_ping(target: str, port: int = 22, timeout: int = 5) -> Dict: return result +def _find_cmd_absolute_path(cmd: str) -> Optional[str]: + """查找命令的绝对路径(兼容特殊情况)""" + common_paths = ["/usr/bin", "/bin", "/usr/sbin", "/sbin", "/usr/local/bin"] + for path in common_paths: + cmd_path = os.path.join(path, cmd) + if os.path.exists(cmd_path) and os.access(cmd_path, os.X_OK): + return cmd_path + return None + + def _run_local(cmd: List[str]) -> subprocess.CompletedProcess: + """执行本地命令,自动查找命令的绝对路径""" + # 查找命令的绝对路径 + cmd_name = cmd[0] + cmd_path = _find_cmd_absolute_path(cmd_name) + if not cmd_path: + raise FileNotFoundError(f"命令不存在:{cmd_name}") + + # 替换为绝对路径 + cmd[0] = cmd_path return subprocess.run( cmd, check=True, @@ -122,7 +142,9 @@ def check_sshd_status(target: Optional[str]) -> Dict: ssh: Optional[paramiko.SSHClient] = None try: ssh = _open_ssh(remote_auth) - stdin, stdout, stderr = ssh.exec_command("systemctl status sshd") + # 查找 systemctl 的绝对路径 + systemctl_path = _find_cmd_absolute_path("systemctl") or "systemctl" + stdin, stdout, stderr = ssh.exec_command(f"{systemctl_path} status sshd") out = stdout.read().decode("utf-8", errors="replace").strip() err = stderr.read().decode("utf-8", errors="replace").strip() if err and "Active:" not in out: @@ -178,22 +200,27 @@ def fix_sshd_config_and_restart(target: Optional[str]) -> Dict: - 若不存在目标键则追加 - 最后重启 sshd """ + # 查找命令的绝对路径 + sed_path = _find_cmd_absolute_path("sed") or "sed" + grep_path = _find_cmd_absolute_path("grep") or "grep" + systemctl_path = _find_cmd_absolute_path("systemctl") or "systemctl" + sed_parts = [] # 替换或解注释三项配置 sed_parts.append( - r"sed -i -e 's/^[#]*[[:space:]]*Port[[:space:]].*/Port 22/' " - r"-e 's/^[#]*[[:space:]]*PermitRootLogin[[:space:]].*/PermitRootLogin yes/' " - r"-e 's/^[#]*[[:space:]]*PasswordAuthentication[[:space:]].*/PasswordAuthentication yes/' " - r"/etc/ssh/sshd_config" + f"{sed_path} -i -e 's/^[#]*[[:space:]]*Port[[:space:]].*/Port 22/' " + f"-e 's/^[#]*[[:space:]]*PermitRootLogin[[:space:]].*/PermitRootLogin yes/' " + f"-e 's/^[#]*[[:space:]]*PasswordAuthentication[[:space:]].*/PasswordAuthentication yes/' " + f"/etc/ssh/sshd_config" ) # 若 key 不存在则追加 for k, line in desired_lines.items(): sed_parts.append( - f"grep -q '^{k}[[:space:]]' /etc/ssh/sshd_config || " + f"{grep_path} -q '^{k}[[:space:]]' /etc/ssh/sshd_config || " f"echo '{line}' >> /etc/ssh/sshd_config" ) # 重启 sshd - sed_parts.append("systemctl restart sshd") + sed_parts.append(f"{systemctl_path} restart sshd") # 组合为单条 shell 命令 return " && ".join(sed_parts) -- Gitee From 44e9bd5546c31850fd030b20131b8b88ced4024e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=9F=B3=E7=9F=B3?= Date: Wed, 10 Dec 2025 18:00:25 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0public?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mcp_tools/base_tools/network_tools/base.py | 2 +- .../oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py index 2ab1f4ecc..ac29b6ca5 100644 --- a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/network_tools/base.py @@ -5,7 +5,7 @@ from typing import Dict, Optional, List import paramiko -from config.base_config_loader import BaseConfig, LanguageEnum +from config.public.base_config_loader import BaseConfig, LanguageEnum logger = logging.getLogger(__name__) diff --git a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py index 64943ecd9..e15959de2 100644 --- a/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py +++ b/mcp_center/servers/oe_cli_mcp_server/mcp_tools/base_tools/ssh_fix_tool/base.py @@ -6,7 +6,7 @@ from typing import Dict, Optional, List import paramiko -from config.base_config_loader import BaseConfig, LanguageEnum +from config.public.base_config_loader import BaseConfig, LanguageEnum logger = logging.getLogger(__name__) -- Gitee