package main import ( "fmt" "io" "io/ioutil" "log" "os" "os/exec" "github.com/gliderlabs/ssh" gossh "golang.org/x/crypto/ssh" ) func shellHandler(s ssh.Session) { cmd := exec.Command("/bin/rc") stdin, err := cmd.StdinPipe() if err != nil { log.Fatal(err) } stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } /* stderr, err := cmd.StderrPipe() if err != nil { log.Fatal(err) } */ err = cmd.Start() if err != nil { log.Fatal(err) } go io.Copy(stdin, s) io.Copy(s, stdout) } func main() { if len(os.Args) < 2 { fmt.Fprintf(os.Stderr, "Usage: %s path-to-pubkey\n", os.Args[0]) } pubAuth := ssh.PublicKeyAuth(func(ctx ssh.Context, key ssh.PublicKey) bool { data, err := ioutil.ReadFile(os.Args[1]) if err != nil { log.Fatal(err) } allowed, _, _, _, _ := ssh.ParseAuthorizedKey(data) return ssh.KeysEqual(key, allowed) }) priv, err := ioutil.ReadFile("./id_rsa") if err != nil { log.Fatal(err) } signer, err := gossh.ParsePrivateKey(priv) if err != nil { log.Fatal(err) } s := &ssh.Server{ Addr: ":2222", Handler: shellHandler, } s.AddHostKey(signer) err = s.SetOption(ssh.NoPty()) if err != nil { log.Fatal(err) } err = s.SetOption(pubAuth) if err != nil { log.Fatal(err) } log.Println("starting ssh server on port 2222...") log.Fatal(s.ListenAndServe()) }