個人的に Goでsshのクライアントコマンド を作ってるのだけど、ssh接続で使用している処理が肥大化してメンテナンスが辛くなってきたので、ライブラリとして外出しすることにした。

以下のようなことが簡単にできるように作ってある。 細かい使い方については GoDoc を参照してもらえれば…(´・ω・`)。

  • ログインシェルへの接続(Ctrl+Cとかタブ補完もできる)
  • ターミナルログの取得(タイムスタンプ付与)
  • sshやhttp,socks5の多段プロキシ接続
  • x11 forwarding
  • port forwarding
  • pkcs11認証(Yubikeyとかの物理トークンを使った認証方式)

サンプルコードはこんな感じ。

// Copyright (c) 2019 Blacknon. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.

// Shell connection Example file.
// Change the value of the variable and compile to make sure that you can actually connect.
//
// This file uses password authentication. Please replace as appropriate.

package main

import (
    "fmt"
    "os"

    sshlib "github.com/blacknon/go-sshlib"
    "golang.org/x/crypto/ssh"
)

var (
    host     = "target.com"
    port     = "22"
    user     = "user"
    password = "password"

    termlog = "./test_termlog"
)

func main() {
    // Create sshlib.Connect
    con := &sshlib.Connect{
        // If you use x11 forwarding, please set to true.
        ForwardX11: false,

        // If you use ssh-agent forwarding, please set to true.
        // And after, run `con.ConnectSshAgent()`.
        ForwardAgent: false,
    }

    // Create ssh.AuthMethod
    authMethod := sshlib.CreateAuthMethodPassword(password)

    // If you use ssh-agent forwarding, uncomment it.
    // con.ConnectSshAgent()

    // Connect ssh server
    err := con.CreateClient(host, user, port, []ssh.AuthMethod{authMethod})
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    // Set terminal log
    con.SetLog(termlog, false)

    // Start ssh shell
    con.Shell()
}

Goのscp用のライブラリも作ってあるので、この辺を利用すればGolangでも結構簡単にsshクライアント作れるんじゃないかなー…と思ってる(´・ω・`)。 ひとまず外出し(+リファクタ)はできたので、自前のコマンドのコードをこっちに移さないとなー…。