gitee.com/h79/goutils@v1.22.10/common/ssh/key.go (about)

     1  package ssh
     2  
     3  import (
     4  	"golang.org/x/crypto/ssh"
     5  	"golang.org/x/crypto/ssh/agent"
     6  	"io"
     7  	"net"
     8  	"os"
     9  )
    10  
    11  func WithKey(username string, path string, keyCallBack ssh.HostKeyCallback) (ssh.ClientConfig, error) {
    12  	signer, err := readKey(path)
    13  	if err != nil {
    14  		return ssh.ClientConfig{}, err
    15  	}
    16  	return AuthKey(username, []ssh.AuthMethod{ssh.PublicKeys(signer)}, keyCallBack)
    17  }
    18  
    19  func WithPassphrase(path string, passpharase []byte, username string, keyCallBack ssh.HostKeyCallback) (ssh.ClientConfig, error) {
    20  	signer, err := readKeyWithPassphrase(path, passpharase)
    21  	if err != nil {
    22  		return ssh.ClientConfig{}, err
    23  	}
    24  	return AuthKey(username, []ssh.AuthMethod{ssh.PublicKeys(signer)}, keyCallBack)
    25  }
    26  
    27  func WithAgent(username string, keyCallBack ssh.HostKeyCallback) (ssh.ClientConfig, error) {
    28  	socket := os.Getenv("SSH_AUTH_SOCK")
    29  	conn, err := net.Dial("unix", socket)
    30  	if err != nil {
    31  		return ssh.ClientConfig{}, err
    32  	}
    33  	client := agent.NewClient(conn)
    34  	return AuthKey(username, []ssh.AuthMethod{ssh.PublicKeysCallback(client.Signers)}, keyCallBack)
    35  }
    36  
    37  func WithPassword(username string, password string, keyCallBack ssh.HostKeyCallback) (ssh.ClientConfig, error) {
    38  	return AuthKey(username, []ssh.AuthMethod{ssh.Password(password)}, keyCallBack)
    39  }
    40  
    41  func AuthKey(username string, auths []ssh.AuthMethod, keyCallBack ssh.HostKeyCallback) (ssh.ClientConfig, error) {
    42  	return ssh.ClientConfig{
    43  		User:            username,
    44  		Auth:            auths,
    45  		HostKeyCallback: keyCallBack,
    46  	}, nil
    47  }
    48  
    49  func PublicKey(file string) ssh.AuthMethod {
    50  	signer, err := readKey(file)
    51  	if err != nil {
    52  		return nil
    53  	}
    54  	return ssh.PublicKeys(signer)
    55  }
    56  
    57  func PublicKeys(filenames []string) []ssh.AuthMethod {
    58  	var methods []ssh.AuthMethod
    59  	for _, filename := range filenames {
    60  		signer := PublicKey(filename)
    61  		if signer != nil {
    62  			methods = append(methods, signer)
    63  		}
    64  	}
    65  	return methods
    66  }
    67  
    68  func readKey(filename string) (ssh.Signer, error) {
    69  	f, err := os.Open(filename)
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  	defer f.Close()
    74  	bytes, _ := io.ReadAll(f)
    75  	return ssh.ParsePrivateKey(bytes)
    76  }
    77  
    78  func readKeyWithPassphrase(filename string, passpharase []byte) (ssh.Signer, error) {
    79  	f, err := os.Open(filename)
    80  	if err != nil {
    81  		return nil, err
    82  	}
    83  	defer f.Close()
    84  	bytes, _ := io.ReadAll(f)
    85  	return ssh.ParsePrivateKeyWithPassphrase(bytes, passpharase)
    86  }