go客户端ssh交换机

连接交换机代码

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

go 复制代码
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 = session
	modes := ssh.TerminalModes{
		ssh.ECHO:          0,     // disable echoing
		ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
		ssh.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

go 复制代码
func (s *DeviceConf) getOutputRealTime(expect string, unExpect string) {
	lenBuf := 128 * 1024
	var n int

	s.outBuf = make([]byte, lenBuf)
	s.bufLen = 0

	for {
		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 - 1
			return
		}
		if lenr == 0 {
			log.Errorf("read len 0")
			s.bufLen = n - 1
			return
		}
		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 - 1
			return
		}

		n += lenr
		//留1024给下次读取
		if n >= lenBuf+1024 {
			log.Errorf("BUFF is too short")
			s.bufLen = n - 1
			return
		}
	}
}
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 = 0
				log.Errorf("default return: %s", time.Now())
				return string(out)
			}
		}
	}

}

问题

提示unable to authenticate, attempted methods [none password], no supported methods remain

原因:密码错误

相关推荐
HAH-HAH2 小时前
【Python 入门】(2)Python 语言基础(变量)
开发语言·python·学习·青少年编程·个人开发·变量·python 语法
递归不收敛2 小时前
一、Java 基础入门:从 0 到 1 认识 Java(详细笔记)
java·开发语言·笔记
zhangfeng11333 小时前
win7 R 4.4.0和RStudio1.25的版本兼容性以及系统区域设置有关 导致Plots绘图面板被禁用,但是单独页面显示
开发语言·人工智能·r语言·生物信息
子午5 小时前
Python的uv包管理工具使用
开发语言·python·uv
HMBBLOVEPDX5 小时前
C++(静态函数)
开发语言·c++
dpxiaolong6 小时前
RK3588 Android12默认移除导航栏
开发语言·python
Pocker_Spades_A6 小时前
Python快速入门专业版(二十九):函数返回值:多返回值、None与函数嵌套调用
服务器·开发语言·python
良木林7 小时前
浅谈原型。
开发语言·javascript·原型模式
烈风7 小时前
004 Rust控制台打印输出
开发语言·后端·rust
一枝小雨7 小时前
【C++】list 容器操作
开发语言·c++·笔记·list·学习笔记