go 远程ssh

653 阅读1分钟

go 远程ssh操作

我的ssh的环境是腾讯云Ubuntu20.04,ssh连接root的时候不成功,应该是/etc/ssh/sshd_config配置文件中root登录的配置没开,具体的我没再去测试,感兴趣的大家可以试试,最后推荐一个项目:github.com/mojocn/feli…

package main

import (
	"os"

	"fmt"

	"golang.org/x/crypto/ssh"

	"log"
)

func main() {

	// 建立SSH客户端连接
	/*
			设置超时连接,生成连接客户端
			func Dial(network, addr string, config *ClientConfig) (*Client, error) {
			conn, err := net.DialTimeout(network, addr, config.Timeout)
			if err != nil {
				return nil, err
			}
			c, chans, reqs, err := NewClientConn(conn, addr, config)
			if err != nil {
				return nil, err
			}
			return NewClient(c, chans, reqs), nil
		}
	*/

	client, err := ssh.Dial("tcp", "127.0.0.1:22", &ssh.ClientConfig{

		User: "lighthouse",

		Auth: []ssh.AuthMethod{ssh.Password("123")},

		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	})

	if err != nil {

		log.Fatalf("SSH dial error: %s", err.Error())

	}

	// 建立新会话

	session, err := client.NewSession()

	if err != nil {

		log.Fatalf("new session error: %s", err.Error())

	}

	defer session.Close()

	/*
			如果Stdout 被初始化过的时候就报错
			func (s *Session) Output(cmd string) ([]byte, error) {
			if s.Stdout != nil {
				return nil, errors.New("ssh: Stdout already set")
			}
			var b bytes.Buffer
			s.Stdout = &b
			最终调用的还是Run()
			err := s.Run(cmd)
			return b.Bytes(), err
		}

	*/

	result, err := session.Output("ls -al")

	if err != nil {

		fmt.Fprintf(os.Stdout, "Failed to run command, Err:%s", err.Error())

		os.Exit(0)

	}

	fmt.Println(string(result))

	// var b bytes.Buffer

	// session.Stdout = &b

	// if err := session.Run("ls"); err != nil {

	// 	panic("Failed to run: " + err.Error())

	// }

	// fmt.Println(b.String())

}

禁用回显,回显就是在终端输入的命令,执行后再显示一遍

package main



import (

  "golang.org/x/crypto/ssh"

  "log"

  "os")



func main() {

  // 建立SSH客户端连接

  client, err := ssh.Dial("tcp", "127.0.0.1:22", &ssh.ClientConfig{

      User:            "lighthouse",

      Auth:            []ssh.AuthMethod{ssh.Password("123")},

      HostKeyCallback: ssh.InsecureIgnoreHostKey(),

  })

  if err != nil {

      log.Fatalf("SSH dial error: %s", err.Error())

  }



    // 建立新会话\

  session, err := client.NewSession()

  defer session.Close()

  if err != nil {

      log.Fatalf("new session error: %s", err.Error())

  }



  session.Stdout = os.Stdout // 会话输出关联到系统标准输出设备

  session.Stderr = os.Stderr // 会话错误输出关联到系统标准错误输出设备

  session.Stdin = os.Stdin   // 会话输入关联到系统标准输入设备

  modes := ssh.TerminalModes{\

      ssh.ECHO:          0// 禁用回显(0禁用,1启动)

      ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud

      ssh.TTY_OP_OSPEED: 14400, //output speed = 14.4kbaud    }

  if err = session.RequestPty("linux", 32, 160, modes); err != nil {

      log.Fatalf("request pty error: %s", err.Error())

  }

  if err = session.Shell(); err != nil {

      log.Fatalf("start shell error: %s", err.Error())

  }

  if err = session.Wait(); err != nil {

      log.Fatalf("return error: %s", err.Error())

  }

}