golang.org/x/crypto/ssh使用

package 

package sshplus

import (
	"fmt"
	"golang.org/x/crypto/ssh"
	"io/ioutil"
)

func NewConfig(keyFile, user string) (config *ssh.ClientConfig, err error) {
	key, err := ioutil.ReadFile(keyFile)
	if err != nil {
		err = fmt.Errorf("unable to read private key: %v", err)
		return
	}

	signer, err := ssh.ParsePrivateKey(key)
	if err != nil {
		err = fmt.Errorf("unable to parse private key: %v", err)
		return
	}

	config = &ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.PublicKeys(signer),
		},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	}
	return
}

func Run(config *ssh.ClientConfig, host, command string, port int) (outPut []byte, err error) {
	client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", host, port), config)
	if err != nil {
		err = fmt.Errorf("unable to connect: %s error %v", host, err)
		return
	}
	defer client.Close()

	session, err := client.NewSession()
	if err != nil{
		err = fmt.Errorf("ssh new session error %v", err)
		return
	}
	defer session.Close()

	outPut, err = session.Output(command)
	if err != nil{
		err = fmt.Errorf("run command %s on host %s error %v", command, host, err)
	}
	return
}

测试 

package sshplus

import (
	"golang.org/x/crypto/ssh"
	"reflect"
	"testing"
)

func TestRun(t *testing.T) {
	type args struct {
		config  *ssh.ClientConfig
		host    string
		command string
		port    int
	}
	config, _ := NewConfig("/home/whz/.ssh/id_rsa", "whz")
	tests := []struct {
		name       string
		args       args
		wantOutPut []byte
		wantErr    bool
	}{
		{
			name: "test1",
			args: args{
				config:  config,
				host:    "127.0.0.1",
				command: "ls $HOME/tmp/a.go",
				port:    22,
			},
			wantOutPut: []byte("/home/whz/tmp/a.go\n"),
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			gotOutPut, err := Run(tt.args.config, tt.args.host, tt.args.command, tt.args.port)
			if (err != nil) != tt.wantErr {
				t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !reflect.DeepEqual(gotOutPut, tt.wantOutPut) {
				t.Errorf("Run() = %v, want %v", gotOutPut, tt.wantOutPut)
			}
		})
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值