You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ollama OpenWebUI SSH工具无输出问题排查求助

SSH命令执行无输出问题排查与修复

问题根源分析

你的代码存在多处逻辑错误,导致能建立SSH连接但无法获取命令执行结果,具体问题如下:

1. 变量名不匹配

Valves类定义的是SSH_HOST,但代码中错误使用self.Valves.SSH_IP进行判断,导致IP检查逻辑失效。

2. UserValves未实例化

在__init__方法中仅初始化了self.Valves,但未创建UserValves的实例,访问self.UserValves.SSH_IP、self.UserValves.SSH_COMMAND会触发属性不存在的错误。

3. 函数参数未实际使用

connect_ssh函数声明接收ssh_ip、ssh_username等参数,但代码中完全依赖类内的Valves变量,参数传递无意义,导致外部传入的凭据和命令无法生效。

4. 输出变量未初始化

读取stdout和stderr前未定义output变量,执行output += ...会抛出NameError。

5. 提前返回导致后续代码不执行

在读取命令输出前就执行了return "say that the command was executed...",后续的关闭连接、返回实际输出的代码永远不会运行,这是无法获取输出的核心原因。

6. SSH连接地址错误

ssh.connect中错误使用self.UserValves.SSH_IP,但UserValves类中并没有SSH_IP字段,应使用self.Valves.SSH_HOST。


修复后的代码

"""
title: ssh connection
description 
"""
    
import paramiko
from pydantic import BaseModel, Field

class Tools:
    class Valves(BaseModel):
        SSH_HOST: str = Field(
            default="111.111.111.111", description="SSH服务器地址"
        )
        SSH_USERNAME: str = Field(
            default="adminuser", description="SSH登录用户名"
        )
        SSH_PASSWORD: str = Field(
            default="thePassword123!", description="SSH登录密码"
        )

    class UserValves(BaseModel):
        SSH_COMMAND: str = Field(
            default="ifconfig",
            description="用户通过聊天输入的命令",
        )

    def __init__(self):
        self.citation = True
        self.valves = self.Valves()
        self.user_valves = self.UserValves()

    def connect_ssh(
        self, ssh_ip: str, ssh_username: str, ssh_password: str, ssh_command: str
    ) -> str:
        """
        通过用户提供的信息建立SSH连接并执行命令,返回命令输出
        :param ssh_ip: SSH服务器IP地址
        :param ssh_username: SSH登录用户名
        :param ssh_password: SSH登录密码
        :param ssh_command: 要执行的命令
        :output: 命令执行的输出结果字符串
        """
        # 使用传入的参数覆盖默认值
        self.valves.SSH_HOST = ssh_ip or self.valves.SSH_HOST
        self.valves.SSH_USERNAME = ssh_username or self.valves.SSH_USERNAME
        self.valves.SSH_PASSWORD = ssh_password or self.valves.SSH_PASSWORD
        self.user_valves.SSH_COMMAND = ssh_command or self.user_valves.SSH_COMMAND

        # 检查必要参数是否齐全
        if not self.valves.SSH_HOST:
            return "请提供SSH服务器IP地址"
        if not self.valves.SSH_USERNAME:
            return "请提供SSH登录用户名"
        if not self.valves.SSH_PASSWORD:
            return "请提供SSH登录密码"
        if not self.user_valves.SSH_COMMAND:
            return "请提供要执行的SSH命令"

        output = ""
        ssh = None
        try:
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(
                self.valves.SSH_HOST,
                username=self.valves.SSH_USERNAME,
                password=self.valves.SSH_PASSWORD,
            )
            stdin, stdout, stderr = ssh.exec_command(self.user_valves.SSH_COMMAND)
            
            # 读取命令输出和错误信息
            stdout_output = stdout.read().decode()
            stderr_output = stderr.read().decode()
            
            if stdout_output:
                output += f"命令输出:\n{stdout_output}\n"
            if stderr_output:
                output += f"错误信息:\n{stderr_output}"
            
            return output.strip() if output else "命令执行无输出"
        except Exception as e:
            return f"连接或执行命令失败: {str(e)}"
        finally:
            if ssh:
                ssh.close()

内容的提问来源于stack exchange,提问作者Pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:01:12