func SshAuthentication(details *config.ArtifactoryDetails) error { _, host, port, err := parseUrl(details.Url) if err != nil { return err } log.Info("Performing SSH authentication...") if details.SshKeyPath == "" { err := cliutils.CheckError(errors.New("Cannot invoke the SshAuthentication function with no SSH key path. ")) if err != nil { return err } } buffer, err := ioutil.ReadFile(details.SshKeyPath) err = cliutils.CheckError(err) if err != nil { return err } key, err := ssh.ParsePrivateKey(buffer) err = cliutils.CheckError(err) if err != nil { return err } sshConfig := &ssh.ClientConfig{ User: "******", Auth: []ssh.AuthMethod{ ssh.PublicKeys(key), }, } hostAndPort := host + ":" + strconv.Itoa(port) connection, err := ssh.Dial("tcp", hostAndPort, sshConfig) err = cliutils.CheckError(err) if err != nil { return err } defer connection.Close() session, err := connection.NewSession() err = cliutils.CheckError(err) if err != nil { return err } defer session.Close() stdout, err := session.StdoutPipe() err = cliutils.CheckError(err) if err != nil { return err } var buf bytes.Buffer go io.Copy(&buf, stdout) session.Run("jfrog-authenticate") var result SshAuthResult err = json.Unmarshal(buf.Bytes(), &result) err = cliutils.CheckError(err) if err != nil { return err } details.Url = cliutils.AddTrailingSlashIfNeeded(result.Href) details.SshAuthHeaders = result.Headers log.Info("SSH authentication successful.") return nil }