Golang SSH连接操作实战

在Golang中如何通过SSH连接到远程服务器并执行命令?能提供一个完整的代码示例吗,包括建立连接、身份验证以及执行基本命令的步骤?另外,如何处理连接超时和认证失败等常见错误?

2 回复

使用Golang进行SSH连接操作,可借助golang.org/x/crypto/ssh包。示例代码包括:

  1. 建立SSH客户端连接
  2. 执行远程命令
  3. 处理会话输入输出
  4. 错误处理

关键步骤:配置认证(密码/密钥)、创建会话、执行命令。注意连接超时和资源释放。

更多关于Golang SSH连接操作实战的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,使用SSH连接远程服务器可以通过 golang.org/x/crypto/ssh 包实现。以下是完整的实战示例,包括连接、执行命令和文件传输。

1. 基础SSH连接与命令执行

package main

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

func main() {
    // SSH配置
    config := &ssh.ClientConfig{
        User: "username",
        Auth: []ssh.AuthMethod{
            ssh.Password("yourpassword"),
            // 或使用密钥 ssh.PublicKeys(key)
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境应验证主机密钥
    }

    // 建立连接
    client, err := ssh.Dial("tcp", "host:22", config)
    if err != nil {
        log.Fatal("连接失败: ", err)
    }
    defer client.Close()

    // 创建会话
    session, err := client.NewSession()
    if err != nil {
        log.Fatal("创建会话失败: ", err)
    }
    defer session.Close()

    // 配置会话IO
    session.Stdout = os.Stdout
    session.Stderr = os.Stderr

    // 执行命令
    err = session.Run("ls -l /tmp")
    if err != nil {
        log.Fatal("命令执行失败: ", err)
    }
}

2. 使用私钥认证

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

func loadPrivateKey(keyPath string) (ssh.AuthMethod, error) {
    key, err := os.ReadFile(keyPath)
    if err != nil {
        return nil, err
    }
    signer, err := ssh.ParsePrivateKey(key)
    if err != nil {
        return nil, err
    }
    return ssh.PublicKeys(signer), nil
}

// 在配置中使用
keyAuth, _ := loadPrivateKey("/path/to/private_key")
config.Auth = []ssh.AuthMethod{keyAuth}

3. 文件传输(SFTP)

import "github.com/pkg/sftp"

func uploadFile(client *ssh.Client, localPath, remotePath string) error {
    sftpClient, err := sftp.NewClient(client)
    if err != nil {
        return err
    }
    defer sftpClient.Close()

    srcFile, err := os.Open(localPath)
    if err != nil {
        return err
    }
    defer srcFile.Close()

    dstFile, err := sftpClient.Create(remotePath)
    if err != nil {
        return err
    }
    defer dstFile.Close()

    _, err = io.Copy(dstFile, srcFile)
    return err
}

关键说明:

  1. 认证方式:支持密码、私钥、键盘交互等
  2. 主机验证:生产环境必须实现 HostKeyCallback
  3. 超时控制:可通过 context 实现超时控制
  4. 连接复用:一个TCP连接可创建多个会话

完整工作流程:

  1. 创建SSH客户端配置
  2. 建立TCP连接
  3. 创建会话(Session)
  4. 配置输入输出
  5. 执行命令/启动Shell
  6. 处理结果

实际使用时建议:

  • 使用 ssh.FixedHostKey 验证服务器指纹
  • 为敏感操作添加超时控制
  • 使用连接池管理多个连接

这个方案适用于服务器管理、自动化部署等场景,可根据具体需求扩展功能。

回到顶部