sshpool

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 18, 2020 License: MIT Imports: 7 Imported by: 8

README

sshpool

Connection pool for x/crypto/ssh connections

API docs: https://pkg.go.dev/github.com/desops/sshpool

This is a connection pooler for golang.org/x/crypto/ssh. It's good for making hundreds (or thousands) of SSH connections to do a lot of things on a lot of hosts.

The pool itself has no configuration apart from a ClientConfig:

package main

import (
	"fmt"
	"io/ioutil"
	"os"

	"github.com/desops/sshpool"
	"golang.org/x/crypto/ssh"
)

func main() {
	if err := run(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}

func run() error {
	buf, err := ioutil.ReadFile("./keys/my_private_ssh_key")
	if err != nil {
		return err
	}

	key, err := ssh.ParsePrivateKey(buf)
	if err != nil {
		return err
	}

	config := &ssh.ClientConfig{
		User: "myuser",
		Auth: []ssh.AuthMethod{
			ssh.PublicKeys(key),
		},
	}

	pool := sshpool.New(config, nil)

	for i := 0; i < 100; i++ {
		go func() {
			err := func() error {
				session, err := pool.Get("myhost")
				if err != nil {
					return err
				}
				defer session.Close() // important: this returns it to the pool

				session.Stdout = os.Stdout
				session.Stderr = os.Stderr

				if err := session.Run("sleep 10"); err != nil {
					ee, ok := err.(*ssh.ExitError)
					if ok {
						return fmt.Errorf("remote command exit status %d", ee.ExitStatus())
					}
					return err
				}
				return nil
			}
			if err != nil {
				fmt.Fprintln(os.Stderr, err)
			}
		}()
	}

	return nil
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Pool

type Pool struct {
	// contains filtered or unexported fields
}

func New

func New(config *ssh.ClientConfig, poolconfig *PoolConfig) *Pool

func (*Pool) Close

func (p *Pool) Close()

func (*Pool) ExecCombinedOutput

func (p *Pool) ExecCombinedOutput(host string, command string) ([]byte, error)

func (*Pool) ExecCombinedOutputString

func (p *Pool) ExecCombinedOutputString(host string, command string) (string, error)

func (*Pool) ExecOutput

func (p *Pool) ExecOutput(host string, command string) ([]byte, error)

func (*Pool) ExecOutputString

func (p *Pool) ExecOutputString(host string, command string) (string, error)

func (*Pool) Get

func (p *Pool) Get(host string) (*Session, error)

Get() creates a session to a specific host. If successful, err will be nil and you must call Close() on the returned *ssh.Session to ensure cleanup.

func (*Pool) Tunnel

func (p *Pool) Tunnel(host string, local, remote string) (*Tunnel, error)

Tunnel() creates an SSH tunnel to host. A local TCP socket will listen on local. Any connections will be proxied to remote via host. Be sure to call Close() to clean up.

type PoolConfig

type PoolConfig struct {
	Debug bool
}

type Session

type Session struct {
	*ssh.Session
	// contains filtered or unexported fields
}

func (*Session) Close

func (s *Session) Close() error

type Tunnel

type Tunnel struct {
	// contains filtered or unexported fields
}

func (*Tunnel) Addr

func (tunnel *Tunnel) Addr() string

func (*Tunnel) Close

func (tunnel *Tunnel) Close() error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL