github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/machine/keys.go (about) 1 //go:build amd64 || arm64 2 // +build amd64 arm64 3 4 package machine 5 6 import ( 7 "errors" 8 "fmt" 9 "io/ioutil" 10 "os" 11 "os/exec" 12 "path/filepath" 13 "strings" 14 15 "github.com/sirupsen/logrus" 16 ) 17 18 var sshCommand = []string{"ssh-keygen", "-N", "", "-t", "ed25519", "-f"} 19 20 // CreateSSHKeys makes a priv and pub ssh key for interacting 21 // the a VM. 22 func CreateSSHKeys(writeLocation string) (string, error) { 23 if err := generatekeys(writeLocation); err != nil { 24 return "", err 25 } 26 b, err := ioutil.ReadFile(writeLocation + ".pub") 27 if err != nil { 28 return "", err 29 } 30 return strings.TrimSuffix(string(b), "\n"), nil 31 } 32 33 func CreateSSHKeysPrefix(dir string, file string, passThru bool, skipExisting bool, prefix ...string) (string, error) { 34 location := filepath.Join(dir, file) 35 36 _, e := os.Stat(location) 37 if !skipExisting || errors.Is(e, os.ErrNotExist) { 38 if err := generatekeysPrefix(dir, file, passThru, prefix...); err != nil { 39 return "", err 40 } 41 } else { 42 fmt.Println("Keys already exist, reusing") 43 } 44 b, err := ioutil.ReadFile(filepath.Join(dir, file) + ".pub") 45 if err != nil { 46 return "", err 47 } 48 return strings.TrimSuffix(string(b), "\n"), nil 49 } 50 51 // generatekeys creates an ed25519 set of keys 52 func generatekeys(writeLocation string) error { 53 args := append(append([]string{}, sshCommand[1:]...), writeLocation) 54 return exec.Command(sshCommand[0], args...).Run() 55 } 56 57 // generatekeys creates an ed25519 set of keys 58 func generatekeysPrefix(dir string, file string, passThru bool, prefix ...string) error { 59 args := append([]string{}, prefix[1:]...) 60 args = append(args, sshCommand...) 61 args = append(args, file) 62 cmd := exec.Command(prefix[0], args...) 63 cmd.Dir = dir 64 if passThru { 65 cmd.Stdin = os.Stdin 66 cmd.Stdout = os.Stdout 67 cmd.Stderr = os.Stderr 68 } 69 logrus.Debugf("Running wsl cmd %v in dir: %s", args, dir) 70 return cmd.Run() 71 }