当前位置: 首页 > news >正文

go 通过ssh连接linux golang.org/x/crypto/ssh

ssh.Dial

golang.org/x/crypto/ssh

package main

import (
    "bytes"
    "log"
    "os"
    "strings"

    "golang.org/x/term"

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

// go ssh 连接ssh
// 参考blog:
//
//  https://www.cnblogs.com/zhzhlong/p/12552410.html
//  https://blog.csdn.net/Naisu_kun/article/details/130598129
func main() {
    log.Println("main ...")
    client, err := ssh.Dial("tcp", "IP地址:22或者其他端口", &ssh.ClientConfig{
       User:            "root或者其他用户名",
       Auth:            []ssh.AuthMethod{ssh.Password("密码")},
       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())
    }

    // session run执行命令
    var b bytes.Buffer
    session.Stdout = &b
    if err := session.Run("pwd"); err != nil {
       log.Fatalln("Failed to run: " + err.Error())
    }
    log.Println(strings.Trim(string(b.String()), "\n"))
    session.Close()

    // session执行Output命令
    session, _ = client.NewSession()
    result, err := session.Output("pwd")
    if err != nil {
       log.Fatalln("Failed to run command, Err:", err.Error())
    }
    log.Println(strings.Trim(string(result), "\n"))
    session.Close()

    // 模拟terminal
    session, _ = client.NewSession()
    // 会话输出关联到系统标准输出设备
    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
    }

    // 获取当前标准输出终端窗口尺寸 // 该操作可能有的平台上不可用,那么下面手动指定终端尺寸即可
    termWidth, termHeight, err := term.GetSize(int(os.Stdout.Fd()))
    if err != nil {
       log.Fatal("unable to terminal.GetSize: ", err)
    }

    // 设置虚拟终端与远程会话关联
    if err = session.RequestPty("linux", termHeight, termWidth, modes); err != nil {
       log.Fatalf("request pty error: %s", err.Error())
    }

    // 启动远程Shell
    if err = session.Shell(); err != nil {
       log.Fatalf("start shell error: %s", err.Error())
    }
    // 启动远程Shell
    if err = session.Wait(); err != nil {
       log.Fatalf("return error: %s", err.Error())
    }
    log.Println("success ..")
}

相关文章:

  • 网络安全设备防护原理 网络安全防护装置
  • WARNING: pip is configured with locations that require TLS/SSL
  • C语言的指针常量、常量指针、指针函数、函数指针的区别
  • 去中心化协作智能生态系统设计
  • 【Flink实战】Flink网络内存和托管内存
  • 可视化工具SciChart如何结合Deepseek快速创建一个React仪表板?
  • CT dicom 去除床板 去除床位,检查床去除
  • Java Web开发实战与项目——Spring Boot与Redis实现缓存管理
  • Unitree Project
  • 深度学习-119-Text2SQL之实现的三种技术途径
  • C语言程序实现shell命令的重定向符号功能
  • D-FINE模型详解及代码复现
  • 酒店旅游API:数据交互的隐形桥梁——以携程API为例
  • Jenkins 视图(View)
  • 蓝桥杯15 填空题
  • TensorFlow v2.16 Overview
  • JDK源码系列(一)Object
  • Kubernetes控制平面组件:APIServer 基于 引导Token 的认证机制
  • C#上位机--选择语句(switch)
  • Typora软件(Markdown编辑器)详细安装教程(附补丁包)2025最详细图文教程安装手册
  • 述评:赖清德当局上台一年恶行累累
  • 马上评|劳动课该如何找回“存在感”
  • 中国证监会副主席李明:目前A股估值水平仍处于相对低位
  • 波兰总统选举第一轮投票结束,出口民调显示将进入第二轮投票
  • 媒体评教师拎起学生威胁要扔下三楼:师风师德不能“悬空”
  • 复旦一校友捐赠1亿元,却不留名