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
相关产品推荐
相关产品推荐

