1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| package sftp
import ( "fmt" "github.com/mitchellh/go-homedir" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "log" "os" "time" )
func getSshClient() (*ssh.Client, error) { env := &OpsEnv{ Passport: "zhagnSan", Password: "123456", Addr: "192.168.99.106", Port: "22", AuthType: 2, } conn, err := newSshClient(env) if err != nil { return nil, err } return conn, nil }
const maxPacket = 1 << 15
func getSftpClient() (*sftp.Client, error) { conn, err := getSshClient() if err != nil { return nil, err } return sftp.NewClient(conn, sftp.MaxPacket(maxPacket)) }
func newSshClient(h *OpsEnv) (*ssh.Client, error) { config := &ssh.ClientConfig{ Timeout: time.Second * 5, User: h.Passport, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } if h.AuthType == 2 { config.Auth = []ssh.AuthMethod{ssh.Password(h.Password)} } else { config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(h.PubKey)} } addr := fmt.Sprintf("%s:%s", h.Addr, h.Port) c, err := ssh.Dial("tcp", addr, config) if err != nil { return nil, err } return c, nil }
func publicKeyAuthFunc(kPath string) ssh.AuthMethod { keyPath, err := homedir.Expand(kPath) if err != nil { log.Fatal("find key's home dir failed", err) } key, err := os.ReadFile(keyPath) if err != nil { log.Fatal("ssh key file read failed", err) } signer, err := ssh.ParsePrivateKey(key) if err != nil { log.Fatal("ssh key signer failed", err) } return ssh.PublicKeys(signer) }
|