GO实现ssh客户端的基本功能

最近有个功能要求实现ssh 客户端的基本功能,想起来Go有自己实现的一套的SSH协议,就从网上找了份源码看了下,发现不支持tab、↑、↓等按键。硬啃文档后修改了下是可以了,下面是修改后的源码。

package main

import (
	"fmt"
	"golang.org/x/crypto/ssh"
	"golang.org/x/crypto/ssh/terminal"
	"log"
	"os"
)

func main() {
	config := &ssh.ClientConfig{
		User: "root",
		Auth: []ssh.AuthMethod{
			ssh.Password("123456"),
		},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	}

	client, err := ssh.Dial("tcp", "192.168.1.130:22", config)
	if err != nil {
		log.Fatal("Failed to dial: ", err)
	}

	session, err := client.NewSession()

	if err != nil {
		panic(err)
	}

	defer session.Close()
	fd := int(os.Stdin.Fd())

	state, err := terminal.MakeRaw(fd)
	if err != nil {
		panic(err)
	}

	defer terminal.Restore(fd, state)

	session.Stdout = os.Stdout
	session.Stderr = os.Stderr
	session.Stdin = os.Stdin

	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
	}

	// Request pseudo terminal
	if err := session.RequestPty("xterm", 40, 80, modes); err != nil {
		log.Fatal("request for pseudo terminal failed: ", err)
	}

	if err := session.Shell(); err != nil {
		log.Fatal("failed to start shell: ", err)
	}

	fmt.Println(session.Wait())
}

效果图

在这里插入图片描述
参考源码博客地址:link.

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
gossh 是 Go 语言实现 SSH 通讯的开发包。 示例代码: package main import ( "github.com/dynport/gossh" "log" ) // returns a function of type gossh.Writer func(...interface{}) // MakeLogger just adds a prefix (DEBUG, INFO, ERROR) func MakeLogger(prefix string) gossh.Writer { return func(args ...interface{}) { log.Println((append([]interface{}{prefix}, args...))...) } } func main() { client := gossh.New("some.host", "user") // my default agent authentication is used. use // client.SetPassword("<secret>") // for password authentication client.DebugWriter = MakeLogger("DEBUG") client.InfoWriter = MakeLogger("INFO ") client.ErrorWriter = MakeLogger("ERROR") defer client.Close() rsp, e := client.Execute("uptime") if e != nil { client.ErrorWriter(e.Error()) } client.InfoWriter(rsp.String()) rsp, e = client.Execute("echo -n $(cat /proc/loadavg); cat /does/not/exists") if e != nil { client.ErrorWriter(e.Error()) client.ErrorWriter("STDOUT: " rsp.Stdout()) client.ErrorWriter("STDERR: " rsp.Stderr()) } } 运行结果: 2013/08/25 00:31:40 DEBUG connecting some.host 2013/08/25 00:31:41 INFO [EXEC ] uptime 2013/08/25 00:31:41 DEBUG 22:31:41 up 375 days, 10:44, 0 users, load average: 0.09, 0.13, 0.22 2013/08/25 00:31:41 INFO => 0.944143 2013/08/25 00:31:41 INFO map[stdout:72 bytes stderr:0 bytes runtime:0.944202 status:0] 2013/08/25 00:31:41 DEBUG already connected 2013/08/25 00:31:41 INFO [EXEC ] echo -n $(cat /proc/loadavg); cat /does/not/exists 2013/08/25 00:31:41 DEBUG 0.09 0.13 0.22 1/455 23396 2013/08/25 00:31:41 ERROR cat: /does/not/exists 2013/08/25 00:31:41 ERROR : No such file or directory 2013/08/25 00:31:41 INFO => 0.067075 2013/08/25 00:31:41 ERROR Process exited with: 1. Reason was: () 2013/08/25 00:31:41 ERROR STDOUT: 0.09 0.13 0.22 1/455 23396 2013/08/25 00:31:41 ERROR STDERR: cat: /does/not/exists: No such file or directory 标签:gossh

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值