golang ssh client(1)

这篇具有很好参考价值的文章主要介绍了golang ssh client(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

package main

import (
	"context"
	"fmt"
	"net"
	"time"

	"golang.org/x/crypto/ssh"
)

type Client struct {
	client *ssh.Client
	user   string
	ip     string
	port   string
}

type CommandInfo struct {
	Cmd           string
	IsInteractive bool
	EndPoint      string
}

type CommandResult struct {
	Cmd    CommandInfo
	Result string
}

func NewClient(ip, port, user, pwd string) (*Client, error) {
	sshcli, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", ip, port), &ssh.ClientConfig{

		User: user,
		Auth: []ssh.AuthMethod{
			ssh.Password(pwd),
		},
		HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error {
			return nil
		}),
		// Timeout 建立tcp连接的超时时间
		Timeout: time.Duration(10) * time.Second,
	})
	if err != nil {
		return nil, err
	}
	return &Client{
		client: sshcli,
		user:   user,
		ip:     ip,
		port:   port,
	}, nil
}

func (cli *Client) Close() error {
	return cli.client.Close()
}

func (cli *Client) Run(cmd string) error {
	session, err := cli.client.NewSession()
	if err != nil {
		fmt.Printf("client NewSession fialed ,err = %v \n", err.Error())
		return err
	}
	defer session.Close()
	return session.Run(cmd)
}

func (cli *Client) CombineOutput(cmd string) ([]byte, error) {
	session, err := cli.client.NewSession()
	if err != nil {
		fmt.Println(err.Error())
		return nil, err
	}
	defer session.Close()
	return session.CombinedOutput(cmd)
}

func (cli *Client) ExecuteWithShell(cmds []CommandInfo, timeout time.Duration) ([]CommandResult, error) {
	ctx, _ := context.WithTimeout(context.Background(), timeout)
	s, _, err := CreateShell(ctx, cli)
	if err != nil {
		return nil, err
	}
	go func() {
		for {
			select {
			case <-ctx.Done():
				s.session.Close()
				return
			}
		}
	}()
	defer s.Close()

	output, err := s.ExecuteCommands(cmds)
	if err != nil {
		return nil, err
	}
	return output, nil
}

文章来源地址https://www.toymoban.com/news/detail-551214.html

到了这里,关于golang ssh client(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang笔记:使用ssh包作为客户端与SSH服务器交互

    Golang中可以使用 golang.org/x/crypto/ssh 包作为SSH客户端或者SSH服务使用。这篇文章将简单记录下作为客户端使用的一些内容。 Package ssh implements an SSH client and server. 作为客户端与SSH服务器操作上来说主要分为三步: 使用一定的参数与SSH服务器建立连接得到 Client 对象; 在 Client 之

    2024年02月09日
    浏览(61)
  • 【已解决】client_loop: send disconnect: Broken pipe|连接CentOS服务器:ssh空闲自动断开

    欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了 【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t / 小程序 React/小程序 R e a c t / 小程序 🔥,中间穿插了一些基础知识的回顾 🌈博客主

    2024年01月16日
    浏览(52)
  • vSphere Web Client 自定义各国语言界面

    哈喽大家好,欢迎来到 虚拟化时代君(XNHCYL) 。 “    大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利……(每天更新不间断,福利不见不散  今天分享的VMware知识很简单。 我们在访问VMwae vC

    2023年04月09日
    浏览(24)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(65)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(56)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(63)
  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(57)
  • 通讯编程006——NodeJS OPC UA Client开发简单教程

    本文介绍如何在NodeJS环境下开发OPC UA Client,通过本文可以对OPC UA的基本概念有所了解,掌握OPC UA的本质。相关软件请登录网信智汇(wangxinzhihui.com)。 开发步骤如下: 1)首先需要安装nodejs,要求版本至少是12。 2)创建项目目录,在cmd下进入项目目录下,执行如下指令: 1)n

    2024年02月09日
    浏览(37)
  • 【Spring Security OAuth2 Client】基本介绍以及定制开发

    OAuth2 协议起来越普及,大多数企业都有自己的一套单点登录系统,通常都会支持 OAuth 协议,但这个单点登录系统通常会在 OAuth 标准协议上多多少少会有改造,我们在企业内部开发一个应用服务,需要对接单点登录 SSO ,只要支持 OAuth 协议,我们就可以使用 spring-boot-starter-

    2024年02月14日
    浏览(36)
  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包