func NewServer() (err error) { // An SSH server is represented by a ServerConfig, which holds // certificate details and handles authentication of ServerConns. config := new(ssh.ServerConfig) config.PublicKeyCallback = HandlePublicKeyCallback config.AuthLogCallback = HandleAuthLogCallback key, err := osext.ReadHostKeys(HostKeysDir) if err != nil { return } for _, v := range key { signer, err := ssh.ParsePrivateKey(v) if err != nil { return err } config.AddHostKey(signer) } // Once a ServerConfig has been configured, connections can be // accepted. conn, err := net.Listen("tcp", ":22") if err != nil { log.Fatal("Failed to listen for connection: ", err) } for { sConn, err := conn.Accept() if err != nil { log.Printf("conn.Accept: %s", err) continue } sshconn, chans, reqs, err := ssh.NewServerConn(sConn, config) if err != nil { log.Printf("ssh.NewServerConn: Failed to handshake: %s", err) continue } // The incoming Request channel must be serviced. go ssh.DiscardRequests(reqs) // Handle the incomming request go HandleServerConn(sshconn, chans) } }