mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package sshutil
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"net"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"golang.org/x/crypto/ssh"
 | 
						|
)
 | 
						|
 | 
						|
const defaultPort = 22
 | 
						|
 | 
						|
var errCallbackDone = errors.New("callback failed on purpose")
 | 
						|
 | 
						|
// addDefaultPort appends a default port if hostport doesn't contain one
 | 
						|
func addDefaultPort(hostport string, defaultPort int) string {
 | 
						|
	_, _, err := net.SplitHostPort(hostport)
 | 
						|
	if err == nil {
 | 
						|
		return hostport
 | 
						|
	}
 | 
						|
	hostport = net.JoinHostPort(hostport, strconv.Itoa(defaultPort))
 | 
						|
	return hostport
 | 
						|
}
 | 
						|
 | 
						|
// SSHKeyScan scans a ssh server for the hostkey; server should be in the form hostname, or hostname:port
 | 
						|
func SSHKeyScan(server string) (string, error) {
 | 
						|
	var key string
 | 
						|
	KeyScanCallback := func(hostport string, remote net.Addr, pubKey ssh.PublicKey) error {
 | 
						|
		hostname, _, err := net.SplitHostPort(hostport)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		key = strings.TrimSpace(fmt.Sprintf("%s %s", hostname, string(ssh.MarshalAuthorizedKey(pubKey))))
 | 
						|
		return errCallbackDone
 | 
						|
	}
 | 
						|
	config := &ssh.ClientConfig{
 | 
						|
		HostKeyCallback: KeyScanCallback,
 | 
						|
	}
 | 
						|
 | 
						|
	server = addDefaultPort(server, defaultPort)
 | 
						|
	conn, err := ssh.Dial("tcp", server, config)
 | 
						|
	if key != "" {
 | 
						|
		// as long as we get the key, the function worked
 | 
						|
		err = nil
 | 
						|
	}
 | 
						|
	if conn != nil {
 | 
						|
		_ = conn.Close()
 | 
						|
	}
 | 
						|
	return key, err
 | 
						|
}
 |