当前位置: 首页 > news >正文

go客户端ssh交换机

连接交换机代码

使用库golang.org/x/crypto/ssh

func (s *SwitchConf) switchNewSession() error {config := &ssh.ClientConfig{User: s.User,Auth: []ssh.AuthMethod{ssh.Password(s.Password),},HostKeyCallback: ssh.InsecureIgnoreHostKey(),Timeout:         30 * time.Second, Config: ssh.Config{			Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "aes256-gcm@openssh.com", "chacha20-poly1305@openssh.com"},}, }address := fmt.Sprintf("%s:22", s.Ip)client, err := ssh.Dial("tcp", address, config)if err != nil {log.Fatalf("Failed to dial: %v", err)return nil}go s.waitConnectClosed(client)session, err := client.NewSession()if err != nil {fmt.Println("Failed to create session:", err)return nil}s.Session = sessionmodes := ssh.TerminalModes{ssh.ECHO:          0,     // disable echoingssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaudssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud}err := s.Session.RequestPty("xterm", 80, 80, modes)if err != nil {fmt.Println("创建requestpty出错", err)return err}// 使用 io.MultiWriter 同时写入 os.Stdout 和缓冲区//multiWriter := io.MultiWriter(os.Stdout, &buf)s.input, err = s.Session.StdinPipe()if err != nil {fmt.Println("StdinPipe错误: ", err)return err}s.output, err = s.Session.StdoutPipe()if err != nil {fmt.Println("StdoutPipe: ", err)return err}s.errput, err = s.Session.StderrPipe()if err != nil {fmt.Println("StderrPipe: ", err)return err}err = s.Session.Shell()if err != nil {fmt.Println("创建shell出错: ", err)return err}go s.getErrorRealTime()return nil
}

执行命令

// 如果不判断什么时候结束,结束后就会一直卡在output.Read

func (s *DeviceConf) getOutputRealTime(expect string, unExpect string) {lenBuf := 128 * 1024var n ints.outBuf = make([]byte, lenBuf)s.bufLen = 0for {if s.output == nil {return}lenr, err := s.output.Read(s.outBuf[n:])if err != nil {log.Errorf("read err: %s", err)s.bufLen = n - 1return}if lenr == 0 {log.Errorf("read len 0")s.bufLen = n - 1return}if strings.Contains(string(s.outBuf[n:n+lenr-1]), expect) || strings.Contains(string(s.outBuf[n:n+lenr-1]), unExpect) {			s.bufLen = n + lenr - 1return}n += lenr//留1024给下次读取if n >= lenBuf+1024 {log.Errorf("BUFF is too short")s.bufLen = n - 1return}}
}
func (s *DeviceConf) runCmd(cmd string, expectSub string, unExpect string) string {if s.Session == nil {err := s.switchNewSession()if err != nil {log.Errorf("switchNewSession error: %s", err)return ""}err = s.getShell()if err != nil {log.Errorf("getShell error: %s", err)return ""}}go s.getOutputRealTime(expectSub, unExpect)go s.getErrorRealTime()_, err := s.input.Write(nputil.Str2bytes("\n " + cmd + "\n"))if err != nil {log.Errorf("写入stdin出错111: %s", err)return ""}timeoutChan := time.After(defaultTimeout)for {select {case <-timeoutChan:log.Errorf("超时了,退出循环: %s", time.Now())return ""default:if s.bufLen != 0 {out := s.outBuf[:s.bufLen]s.bufLen = 0log.Errorf("default return: %s", time.Now())return string(out)}}}}

问题

提示unable to authenticate, attempted methods [none password], no supported methods remain
原因:密码错误

http://www.lqws.cn/news/446815.html

相关文章:

  • Mysql5.7 自动备份恢复示例
  • 渗透实战:绕过沙箱机制的反射型XSS
  • ROS学习之动作通信
  • 苍穹外卖--WebSocket、来单提醒、客户催单
  • 图像特征检测算法ORB
  • ros中相机话题在web页面上的显示,尝试js解析sensor_msgs/Image数据
  • 动态规划:01 背包(闫氏DP分析法)
  • Linux系统远程操作和程序编译
  • JS红宝书笔记 - 8.1 理解对象
  • 零基础指南:利用Cpolar内网穿透实现Synology Drive多端笔记同步
  • PHP 生成当月日期
  • 解决 Docker 里 DrissionPage 无法连接浏览器的问题,内含直接可用的Docker镜像(DrissionPage 浏览器链接失败 怎么办?)
  • 23种设计模式--简单工厂模式理解版
  • 日本生活:日语语言学校-日语作文-沟通无国界(3)-题目:わたしの友達
  • 基于 Web 的 3D 设计工具Spline介绍
  • 理解服务注册与发现
  • DeserializationViewer使用说明
  • java IO流
  • Git vs Perforce P4:版本控制系统选型指南(附适用场景、团队类型)
  • 【嵌入式】鲁班猫玩法大全
  • LVDS接口
  • 华为网路设备学习-25(路由器OSPF - 特性专题 二)
  • vscode设置代码字体
  • repo 工具
  • 行业热点丨手机中框设计如何体现增材思维?
  • 计算机导论期末快速复习指南
  • “本地化思维+模块化体验”:一款轻量数据中心监控系统的真实测评
  • 软件测试基础知识(一)
  • StableDiffusion实战-手机壁纸制作 第一篇:从零基础到生成艺术品的第一步!
  • API 接口:程序世界的通用语言与交互基因