TH小破站

  • 首页
  • 容器
    • 认识Docker
    • DockerFile详解
  • k8s
    • 认识Kubernetes
    • Kubernetes部署--(kubeadm方式)
    • kubeasz部署k8s集群
    • Ansible-binary部署k8s集群-1.31.2
  • Ceph
    • 认识分布式存储
    • CPEH部署
  • CI/CD
    • DevOps认识
    • 部署--Gitlab
  • ELK
    • ELK简介
    • Elasticsearch
    • Kibana部署
    • Logstash
    • ELK--收集 tomcat 日志(实战)
  • HD
    • 认识--大数据
    • Hadoop-单机部署
    • Hadoop-伪分布部署
    • Hadoop-完全分布部署
    • Hadoop-(HA)完全分布部署
    • Ambari自动部署--Hadoop
  • Nginx
    • Nginx功能介绍
    • Nginx安全选项
    • Nginx配置文件简单介绍
    • 网站服务器部署
  • 监控
    • ZABBIX-部署(yum)
    • ZABBIX-编译安装
  • 云计算
    • KVM 概述
    • OpenStack企业级部署(T版)
    • OpenStack之dashboard部署
    • OpenStack-controller的高可用
    • openstack(Caracal版_ubuntu版本)部署
  • 数据库
    • mariadb与mysql
    • mysql主从
    • MySQL--冷备(实战)
    • MySQL--热备(dump表)
    • MySQL--热备(dump库)
    • 数据恢复实战案例
    • Xtrabackup实现MySql8.x全量备份
    • MyCat实现数据库读写分离
    • MHA实现数据库高可用
    • Percona XtraDB(PXC)实现数据库集群高可用
    • 数据库压力测试
    • PostgreSQL 基操
    • PostgreSQL备份恢复
    • PostgreSQL高可用
    • MongDB安装配置基础使用
    • MongoDB实现复制集
    • MongoDB备份还原
  • 自动化
    • ssh远程服务原理及配置
    • Ansible剧本文件应用
    • Ansible管理服务介绍
    • Ansible自动化部署node_exporter(包含升级,回滚)
    • Saltstack-部署安装
  • 脚本
    • 一键查看服务器资源利用率
    • 一键生成SSL证书
    • 保存指定数量的文件/目录
    • 初始化服务器
    • 扫描可用IP
    • 批量分发SSH密钥
    • 监控多主机磁盘脚本
    • 一键安装MySQL8.x脚本
    • Python脚本监控ES集群
    • 资源巡检脚本
    • 查看各用户使用的cpu占比
热衷于分享
架构师成长之路 !!!
  1. 首页
  2. 开发
  3. 正文

Go语言通过本地远程控制Linux

2024年4月15日 1124点热度 0人点赞 0条评论

GO--SSH连接实现

前提

生成密钥

分发密钥

 root@ubuntu2204-244:~# ssh-copy-id 192.168.139.244
 root@ubuntu2204-244:~# ssh-copy-id 192.168.139.241

代码目录

具体Go代码

 package main
 ​
 import (
     "fmt"
     "golang.org/x/crypto/ssh"
     "os"
     "time"
 )
 ​
 type message struct {
     User    string
     Host    string
     Prkey   string
     Port    int
     Commond string
 }
 ​
 // 实现方式一: 通过结构体方法的形式实现
 func (m *message) SSHConnectWithKey() (string, error) {
     // 读取私钥文件
     key, err := os.ReadFile(m.Prkey)
     if err != nil {
         return "", err
     }
 ​
     // 解析私钥
     signer, err := ssh.ParsePrivateKey(key)
     if err != nil {
         return "", err
     }
 ​
     // 创建SSH客户端配置
     config := &ssh.ClientConfig{
         User: m.User,
         Auth: []ssh.AuthMethod{
             ssh.PublicKeys(signer),
         },
         HostKeyCallback: ssh.InsecureIgnoreHostKey(),
     }
 ​
     // 连接到SSH服务器
     client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", m.Host, m.Port), config)
     if err != nil {
         return "", err
     }
     defer client.Close()
 ​
     // 创建SSH会话
     session, err := client.NewSession()
     if err != nil {
         return "", err
     }
     defer session.Close()
 ​
     // 执行命令
     output, err := session.CombinedOutput(m.Commond)
     if err != nil {
         return "", err
     }
     fmt.Println(string(output))
     return string(output), nil
 }
 ​
 // 实现方式一: 通过函数的形式实现
 func RunShell(addr string, shell string) (string, error) {
     privekey, _ := os.ReadFile("./test/id_rsa")
     signer, err := ssh.ParsePrivateKey(privekey)
     config := &ssh.ClientConfig{
         User: "root",
         Auth: []ssh.AuthMethod{
             ssh.PublicKeys(signer),
         },
         Timeout:         2 * time.Second,
         HostKeyCallback: ssh.InsecureIgnoreHostKey(),
     }
     session, err := ssh.Dial("tcp", addr, config)
     if err != nil {
         fmt.Printf("连接主机异常-%v:%v\n", addr, err)
         return "", err
     }
     defer session.Close()
     newSession, err := session.NewSession()
     if err != nil {
         fmt.Printf("获取主机回话信息失败:%v\n", err)
         return "", err
     }
     defer newSession.Close()
     output, err := newSession.Output(shell)
     if err != nil {
         fmt.Printf("命执行失败,执行命令:%v 异常信息:%v\n", shell, err)
         return "", err
     }
     return string(output), err
 ​
 }
 func main() {
     // 实现方法一
     var con message
     con.Host = "192.168.139.241"
     con.User = "root"
     con.Port = 22
     con.Prkey = "./test/id_rsa"
     con.Commond = "touch 192.168.139.241.txt && ls -l"
     con.SSHConnectWithKey()
 ​
     // 实现方法二
     shell, err := RunShell("192.168.139.244:22", "touch 192.168.139.244.txt && ls -l")
     if err != nil {
         panic(err)
     }
     fmt.Println(shell)
 }
 ​

输出结果

 C:\Users\TH\AppData\Local\Temp\GoLand\___go_build_main_go__3_.exe
 total 4
 -rw-r--r-- 1 root root    0 Apr 15 21:04 192.168.139.241.txt
 drwx------ 3 root root 4096 Mar 22 11:17 snap
 ​
 total 4
 -rw-r--r-- 1 root root    0 Apr 15 21:04 192.168.139.244.txt
 drwx------ 3 root root 4096 Mar 22 11:17 snap
标签: 暂无
最后更新:2024年4月15日

tanghao946

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • GO--SSH连接实现
    • 前提
    • 具体Go代码

COPYRIGHT © 2025 TH小破站. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2023013789号

渝公网安备50011702500926号