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 }