| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <meta name="generator" content="doc2go"> | |
| <title>ssh</title> | |
| <style> | |
| body { | |
| margin: 1em 2em; | |
| font-family: Helvetica, sans-serif; | |
| background-color: #f8f8f8; | |
| font-size: 1em; | |
| } | |
| h1, | |
| h2, | |
| h3, | |
| h4, | |
| h5, | |
| h6 { | |
| margin-top: 0.3em; | |
| margin-bottom: 0.3em; | |
| } | |
| h1, | |
| h2, | |
| h3, | |
| h4 { | |
| font-weight: 500; | |
| } | |
| h2 { | |
| font-size: 1.75em | |
| } | |
| h3 { | |
| font-size: 1.5em | |
| } | |
| h4 { | |
| font-size: 1.33em | |
| } | |
| h5 { | |
| font-size: 1em | |
| } | |
| a { | |
| text-decoration: none; | |
| color: #0366a5; | |
| } | |
| a:hover { | |
| text-decoration: underline; | |
| } | |
| a.permalink { | |
| display: none; | |
| } | |
| a.permalink:hover { | |
| text-decoration: none; | |
| } | |
| *:hover>a.permalink { | |
| display: inline; | |
| } | |
| nav { | |
| padding: 1em; | |
| background-color: #eee; | |
| border-radius: 0.5em; | |
| display: flex; | |
| flex-wrap: wrap; | |
| } | |
| nav .navbar-right { | |
| margin-left: auto; | |
| } | |
| /* Remove first level of nesting for a package's index section. */ | |
| #pkg-index+ul, | |
| #pkg-examples+ul { | |
| list-style-type: none; | |
| padding: 0; | |
| } | |
| code, | |
| kbd, | |
| pre { | |
| font-family: Consolas, monospace; | |
| } | |
| pre { | |
| color: #222; | |
| overflow-x: auto; | |
| border: 1px solid #ccc; | |
| border-radius: 0.5em; | |
| background-color: #eee; | |
| padding: 0.75em; | |
| font-size: 0.9em; | |
| } | |
| details.example>summary { | |
| color: #0366a5; | |
| cursor: pointer; | |
| } | |
| details.deprecated>summary { | |
| list-style: none; | |
| } | |
| span.deprecated-tag { | |
| color: #eee; | |
| background-color: #999; | |
| padding: 0.125rem 0.3rem; | |
| border-radius: 0.3rem; | |
| font-size: 0.7rem; | |
| vertical-align: middle; | |
| cursor: pointer; | |
| } | |
| #search { | |
| margin: 0.3em 0; | |
| } | |
| #generated-by-footer { | |
| font-size: x-small; | |
| } | |
| /* Background */ | |
| .bg { | |
| background-color: #ffffff; | |
| } | |
| /* PreWrapper */ | |
| .chroma { | |
| background-color: #ffffff; | |
| } | |
| /* Error */ | |
| .chroma .err { | |
| color: #a61717; | |
| background-color: #e3d2d2 | |
| } | |
| /* LineLink */ | |
| .chroma .lnlinks { | |
| outline: none; | |
| text-decoration: none; | |
| color: inherit | |
| } | |
| /* LineTableTD */ | |
| .chroma .lntd { | |
| vertical-align: top; | |
| padding: 0; | |
| margin: 0; | |
| border: 0; | |
| } | |
| /* LineTable */ | |
| .chroma .lntable { | |
| border-spacing: 0; | |
| padding: 0; | |
| margin: 0; | |
| border: 0; | |
| } | |
| /* LineHighlight */ | |
| .chroma .hl { | |
| background-color: #e5e5e5 | |
| } | |
| /* LineNumbersTable */ | |
| .chroma .lnt { | |
| white-space: pre; | |
| -webkit-user-select: none; | |
| user-select: none; | |
| margin-right: 0.4em; | |
| padding: 0 0.4em 0 0.4em; | |
| color: #7f7f7f | |
| } | |
| /* LineNumbers */ | |
| .chroma .ln { | |
| white-space: pre; | |
| -webkit-user-select: none; | |
| user-select: none; | |
| margin-right: 0.4em; | |
| padding: 0 0.4em 0 0.4em; | |
| color: #7f7f7f | |
| } | |
| /* Line */ | |
| .chroma .line { | |
| display: flex; | |
| } | |
| /* Keyword */ | |
| .chroma .k { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* KeywordConstant */ | |
| .chroma .kc { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* KeywordDeclaration */ | |
| .chroma .kd { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* KeywordNamespace */ | |
| .chroma .kn { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* KeywordPseudo */ | |
| .chroma .kp { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* KeywordReserved */ | |
| .chroma .kr { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* KeywordType */ | |
| .chroma .kt { | |
| color: #445588; | |
| font-weight: bold | |
| } | |
| /* NameAttribute */ | |
| .chroma .na { | |
| color: #008080 | |
| } | |
| /* NameBuiltin */ | |
| .chroma .nb { | |
| color: #0086b3 | |
| } | |
| /* NameBuiltinPseudo */ | |
| .chroma .bp { | |
| color: #999999 | |
| } | |
| /* NameClass */ | |
| .chroma .nc { | |
| color: #445588; | |
| font-weight: bold | |
| } | |
| /* NameConstant */ | |
| .chroma .no { | |
| color: #008080 | |
| } | |
| /* NameDecorator */ | |
| .chroma .nd { | |
| color: #3c5d5d; | |
| font-weight: bold | |
| } | |
| /* NameEntity */ | |
| .chroma .ni { | |
| color: #800080 | |
| } | |
| /* NameException */ | |
| .chroma .ne { | |
| color: #990000; | |
| font-weight: bold | |
| } | |
| /* NameFunction */ | |
| .chroma .nf { | |
| color: #990000; | |
| font-weight: bold | |
| } | |
| /* NameLabel */ | |
| .chroma .nl { | |
| color: #990000; | |
| font-weight: bold | |
| } | |
| /* NameNamespace */ | |
| .chroma .nn { | |
| color: #555555 | |
| } | |
| /* NameTag */ | |
| .chroma .nt { | |
| color: #000080 | |
| } | |
| /* NameVariable */ | |
| .chroma .nv { | |
| color: #008080 | |
| } | |
| /* NameVariableClass */ | |
| .chroma .vc { | |
| color: #008080 | |
| } | |
| /* NameVariableGlobal */ | |
| .chroma .vg { | |
| color: #008080 | |
| } | |
| /* NameVariableInstance */ | |
| .chroma .vi { | |
| color: #008080 | |
| } | |
| /* LiteralString */ | |
| .chroma .s { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringAffix */ | |
| .chroma .sa { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringBacktick */ | |
| .chroma .sb { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringChar */ | |
| .chroma .sc { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringDelimiter */ | |
| .chroma .dl { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringDoc */ | |
| .chroma .sd { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringDouble */ | |
| .chroma .s2 { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringEscape */ | |
| .chroma .se { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringHeredoc */ | |
| .chroma .sh { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringInterpol */ | |
| .chroma .si { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringOther */ | |
| .chroma .sx { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringRegex */ | |
| .chroma .sr { | |
| color: #009926 | |
| } | |
| /* LiteralStringSingle */ | |
| .chroma .s1 { | |
| color: #dd1144 | |
| } | |
| /* LiteralStringSymbol */ | |
| .chroma .ss { | |
| color: #990073 | |
| } | |
| /* LiteralNumber */ | |
| .chroma .m { | |
| color: #009999 | |
| } | |
| /* LiteralNumberBin */ | |
| .chroma .mb { | |
| color: #009999 | |
| } | |
| /* LiteralNumberFloat */ | |
| .chroma .mf { | |
| color: #009999 | |
| } | |
| /* LiteralNumberHex */ | |
| .chroma .mh { | |
| color: #009999 | |
| } | |
| /* LiteralNumberInteger */ | |
| .chroma .mi { | |
| color: #009999 | |
| } | |
| /* LiteralNumberIntegerLong */ | |
| .chroma .il { | |
| color: #009999 | |
| } | |
| /* LiteralNumberOct */ | |
| .chroma .mo { | |
| color: #009999 | |
| } | |
| /* Operator */ | |
| .chroma .o { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* OperatorWord */ | |
| .chroma .ow { | |
| color: #000000; | |
| font-weight: bold | |
| } | |
| /* Comment */ | |
| .chroma .c { | |
| color: #999988; | |
| font-style: italic | |
| } | |
| /* CommentHashbang */ | |
| .chroma .ch { | |
| color: #999988; | |
| font-style: italic | |
| } | |
| /* CommentMultiline */ | |
| .chroma .cm { | |
| color: #999988; | |
| font-style: italic | |
| } | |
| /* CommentSingle */ | |
| .chroma .c1 { | |
| color: #999988; | |
| font-style: italic | |
| } | |
| /* CommentSpecial */ | |
| .chroma .cs { | |
| color: #999999; | |
| font-weight: bold; | |
| font-style: italic | |
| } | |
| /* CommentPreproc */ | |
| .chroma .cp { | |
| color: #999999; | |
| font-weight: bold; | |
| font-style: italic | |
| } | |
| /* CommentPreprocFile */ | |
| .chroma .cpf { | |
| color: #999999; | |
| font-weight: bold; | |
| font-style: italic | |
| } | |
| /* GenericDeleted */ | |
| .chroma .gd { | |
| color: #000000; | |
| background-color: #ffdddd | |
| } | |
| /* GenericEmph */ | |
| .chroma .ge { | |
| color: #000000; | |
| font-style: italic | |
| } | |
| /* GenericError */ | |
| .chroma .gr { | |
| color: #aa0000 | |
| } | |
| /* GenericHeading */ | |
| .chroma .gh { | |
| color: #999999 | |
| } | |
| /* GenericInserted */ | |
| .chroma .gi { | |
| color: #000000; | |
| background-color: #ddffdd | |
| } | |
| /* GenericOutput */ | |
| .chroma .go { | |
| color: #888888 | |
| } | |
| /* GenericPrompt */ | |
| .chroma .gp { | |
| color: #555555 | |
| } | |
| /* GenericStrong */ | |
| .chroma .gs { | |
| font-weight: bold | |
| } | |
| /* GenericSubheading */ | |
| .chroma .gu { | |
| color: #aaaaaa | |
| } | |
| /* GenericTraceback */ | |
| .chroma .gt { | |
| color: #aa0000 | |
| } | |
| /* GenericUnderline */ | |
| .chroma .gl { | |
| text-decoration: underline | |
| } | |
| /* TextWhitespace */ | |
| .chroma .w { | |
| color: #bbbbbb | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <main><h2 id="pkg-overview">package ssh</h2> | |
| <pre class="chroma"><span class="kn">import</span> <span class="s">"golang.org/x/crypto/ssh"</span></pre> | |
| <p>Package ssh implements an SSH client and server. | |
| <p>SSH is a transport security protocol, an authentication protocol and a | |
| family of application protocols. The most typical application level | |
| protocol is a remote shell and this is specifically implemented. However, | |
| the multiplexed nature of SSH is exposed to users that wish to support | |
| others. | |
| <p>References: | |
| <pre>[PROTOCOL]: https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL?rev=HEAD | |
| [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD | |
| [SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1 | |
| </pre> | |
| <p>This package does not fall under the stability promise of the Go language itself, | |
| so its API may be changed when pressing needs arise. | |
| <h3 id="pkg-index">Index</h3> | |
| <ul> | |
| <li><a href="#pkg-constants">Constants</a></li><li><a href="#pkg-variables">Variables</a></li><li><a href="#FingerprintLegacyMD5">func FingerprintLegacyMD5(pubKey PublicKey) string</a></li> | |
| <li><a href="#FingerprintSHA256">func FingerprintSHA256(pubKey PublicKey) string</a></li> | |
| <li><a href="#Marshal">func Marshal(msg interface{}) []byte</a></li> | |
| <li><a href="#MarshalAuthorizedKey">func MarshalAuthorizedKey(key PublicKey) []byte</a></li> | |
| <li><a href="#MarshalPrivateKey">func MarshalPrivateKey(key crypto.PrivateKey, options MarshalPrivateKeyOptions) (*pem.Block, error)</a></li> | |
| <li><a href="#Unmarshal">func Unmarshal(data []byte, out interface{}) error</a></li> | |
| <li> | |
| <a href="#Algorithms">type Algorithms</a> | |
| <ul> | |
| <li><a href="#InsecureAlgorithms">func InsecureAlgorithms() Algorithms</a></li> | |
| <li><a href="#SupportedAlgorithms">func SupportedAlgorithms() Algorithms</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#AuthMethod">type AuthMethod</a> | |
| <ul> | |
| <li><a href="#GSSAPIWithMICAuthMethod">func GSSAPIWithMICAuthMethod(gssAPIClient GSSAPIClient, target string) AuthMethod</a></li> | |
| <li><a href="#KeyboardInteractive">func KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod</a></li> | |
| <li><a href="#Password">func Password(secret string) AuthMethod</a></li> | |
| <li><a href="#PasswordCallback">func PasswordCallback(prompt func() (secret string, err error)) AuthMethod</a></li> | |
| <li><a href="#PublicKeys">func PublicKeys(signers ...Signer) AuthMethod</a></li> | |
| <li><a href="#PublicKeysCallback">func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMethod</a></li> | |
| <li><a href="#RetryableAuthMethod">func RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#BannerCallback">type BannerCallback</a> | |
| <ul> | |
| <li><a href="#BannerDisplayStderr">func BannerDisplayStderr() BannerCallback</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#BannerError">type BannerError</a> | |
| <ul> | |
| <li><a href="#BannerError.Error">func (b *BannerError) Error() string</a></li> | |
| <li><a href="#BannerError.Unwrap">func (b *BannerError) Unwrap() error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#CertChecker">type CertChecker</a> | |
| <ul> | |
| <li><a href="#CertChecker.Authenticate">func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permissions, error)</a></li> | |
| <li><a href="#CertChecker.CheckCert">func (c *CertChecker) CheckCert(principal string, cert *Certificate) error</a></li> | |
| <li><a href="#CertChecker.CheckHostKey">func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Certificate">type Certificate</a> | |
| <ul> | |
| <li><a href="#Certificate.Marshal">func (c *Certificate) Marshal() []byte</a></li> | |
| <li><a href="#Certificate.SignCert">func (c *Certificate) SignCert(rand io.Reader, authority Signer) error</a></li> | |
| <li><a href="#Certificate.Type">func (c *Certificate) Type() string</a></li> | |
| <li><a href="#Certificate.Verify">func (c *Certificate) Verify(data []byte, sig *Signature) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Channel">type Channel</a> | |
| <ul> | |
| <li><a href="#Channel.Close">func (c *Channel) Close() error</a></li> | |
| <li><a href="#Channel.CloseWrite">func (c *Channel) CloseWrite() error</a></li> | |
| <li><a href="#Channel.Handle">func (c *Channel) Handle(handler RequestHandler) error</a></li> | |
| <li><a href="#Channel.Read">func (c *Channel) Read(data []byte) (int, error)</a></li> | |
| <li><a href="#Channel.SendRequest">func (c *Channel) SendRequest(name string, wantReply bool, payload []byte) (bool, error)</a></li> | |
| <li><a href="#Channel.SetDeadline">func (c *Channel) SetDeadline(deadline time.Time) error</a></li> | |
| <li><a href="#Channel.SetReadDeadline">func (c *Channel) SetReadDeadline(deadline time.Time) error</a></li> | |
| <li><a href="#Channel.SetWriteDeadline">func (c *Channel) SetWriteDeadline(deadline time.Time) error</a></li> | |
| <li><a href="#Channel.Stderr">func (c *Channel) Stderr() io.ReadWriter</a></li> | |
| <li><a href="#Channel.Write">func (c *Channel) Write(data []byte) (int, error)</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#ChannelHandler">type ChannelHandler</a> | |
| </li> | |
| <li> | |
| <a href="#ChannelHandlerFunc">type ChannelHandlerFunc</a> | |
| <ul> | |
| <li><a href="#ChannelHandlerFunc.NewChannel">func (f ChannelHandlerFunc) NewChannel(ch *NewChannel)</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Client">type Client</a> | |
| <ul> | |
| <li><a href="#Dial">func Dial(ctx context.Context, network, addr string, config *ClientConfig) (*Client, error)</a></li> | |
| <li><a href="#NewClient">func NewClient(c *ClientConn) *Client</a></li> | |
| <li><a href="#Client.Close">func (c Client) Close() error</a></li> | |
| <li><a href="#Client.Dial">func (c *Client) Dial(ctx context.Context, n, addr string) (net.Conn, error)</a></li> | |
| <li><a href="#Client.DialTCP">func (c *Client) DialTCP(ctx context.Context, n string, laddr, raddr *net.TCPAddr) (net.Conn, error)</a></li> | |
| <li><a href="#Client.HandleChannelOpen">func (c *Client) HandleChannelOpen(channelType string, handler ChannelHandler) error</a></li> | |
| <li><a href="#Client.Listen">func (c *Client) Listen(n, addr string) (net.Listener, error)</a></li> | |
| <li><a href="#Client.ListenUnix">func (c *Client) ListenUnix(socketPath string) (net.Listener, error)</a></li> | |
| <li><a href="#Client.NewSession">func (c *Client) NewSession() (*Session, error)</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#ClientConfig">type ClientConfig</a> | |
| </li> | |
| <li> | |
| <a href="#ClientConn">type ClientConn</a> | |
| <ul> | |
| <li><a href="#NewClientConn">func NewClientConn(c net.Conn, addr string, config *ClientConfig) (*ClientConn, error)</a></li> | |
| <li><a href="#ClientConn.Close">func (c ClientConn) Close() error</a></li> | |
| <li><a href="#ClientConn.Handle">func (c *ClientConn) Handle(channelHandler ChannelHandler, requestHandler RequestHandler) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#ClientHandler">type ClientHandler</a> | |
| </li> | |
| <li> | |
| <a href="#ClientHandlerFunc">type ClientHandlerFunc</a> | |
| <ul> | |
| <li><a href="#ClientHandlerFunc.HandleClient">func (f ClientHandlerFunc) HandleClient(conn *ServerConn)</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Config">type Config</a> | |
| <ul> | |
| <li><a href="#Config.SetDefaults">func (c *Config) SetDefaults()</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#ConnMetadata">type ConnMetadata</a> | |
| <ul> | |
| <li><a href="#ConnMetadata.ClientVersion">func (c ConnMetadata) ClientVersion() []byte</a></li> | |
| <li><a href="#ConnMetadata.LocalAddr">func (c ConnMetadata) LocalAddr() net.Addr</a></li> | |
| <li><a href="#ConnMetadata.RemoteAddr">func (c ConnMetadata) RemoteAddr() net.Addr</a></li> | |
| <li><a href="#ConnMetadata.ServerVersion">func (c ConnMetadata) ServerVersion() []byte</a></li> | |
| <li><a href="#ConnMetadata.SessionID">func (c ConnMetadata) SessionID() []byte</a></li> | |
| <li><a href="#ConnMetadata.User">func (c ConnMetadata) User() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#CryptoPublicKey">type CryptoPublicKey</a> | |
| </li> | |
| <li> | |
| <a href="#ExitError">type ExitError</a> | |
| <ul> | |
| <li><a href="#ExitError.Error">func (e *ExitError) Error() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#ExitMissingError">type ExitMissingError</a> | |
| <ul> | |
| <li><a href="#ExitMissingError.Error">func (e *ExitMissingError) Error() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#GSSAPIClient">type GSSAPIClient</a> | |
| </li> | |
| <li> | |
| <a href="#GSSAPIServer">type GSSAPIServer</a> | |
| </li> | |
| <li> | |
| <a href="#GSSAPIWithMICConfig">type GSSAPIWithMICConfig</a> | |
| </li> | |
| <li> | |
| <a href="#HostKeyCallback">type HostKeyCallback</a> | |
| <ul> | |
| <li><a href="#FixedHostKey">func FixedHostKey(key PublicKey) HostKeyCallback</a></li> | |
| <li><a href="#InsecureIgnoreHostKey">func InsecureIgnoreHostKey() HostKeyCallback</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#KeyboardInteractiveChallenge">type KeyboardInteractiveChallenge</a> | |
| </li> | |
| <li> | |
| <a href="#MarshalPrivateKeyOptions">type MarshalPrivateKeyOptions</a> | |
| </li> | |
| <li> | |
| <a href="#NewChannel">type NewChannel</a> | |
| <ul> | |
| <li><a href="#NewChannel.Accept">func (c *NewChannel) Accept() (*Channel, error)</a></li> | |
| <li><a href="#NewChannel.ChannelType">func (c *NewChannel) ChannelType() string</a></li> | |
| <li><a href="#NewChannel.ExtraData">func (c *NewChannel) ExtraData() []byte</a></li> | |
| <li><a href="#NewChannel.Reject">func (c *NewChannel) Reject(reason RejectionReason, message string) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#OpenChannelError">type OpenChannelError</a> | |
| <ul> | |
| <li><a href="#OpenChannelError.Error">func (e *OpenChannelError) Error() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#PartialSuccessError">type PartialSuccessError</a> | |
| <ul> | |
| <li><a href="#PartialSuccessError.Error">func (p *PartialSuccessError) Error() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#PassphraseMissingError">type PassphraseMissingError</a> | |
| <ul> | |
| <li><a href="#PassphraseMissingError.Error">func (*PassphraseMissingError) Error() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Permissions">type Permissions</a> | |
| </li> | |
| <li> | |
| <a href="#PrivateKeySigner">type PrivateKeySigner</a> | |
| <ul> | |
| <li><a href="#ParsePrivateKey">func ParsePrivateKey(pemBytes []byte) (*PrivateKeySigner, error)</a></li> | |
| <li><a href="#ParsePrivateKeyWithPassphrase">func ParsePrivateKeyWithPassphrase(pemBytes, passphrase []byte) (*PrivateKeySigner, error)</a></li> | |
| <li><a href="#PrivateKeySigner.CryptoSigner">func (k *PrivateKeySigner) CryptoSigner() crypto.Signer</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#PublicKey">type PublicKey</a> | |
| <ul> | |
| <li><a href="#NewPublicKey">func NewPublicKey(key crypto.PublicKey) (PublicKey, error)</a></li> | |
| <li><a href="#ParseAuthorizedKey">func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error)</a></li> | |
| <li><a href="#ParseKnownHosts">func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey, comment string, rest []byte, ...)</a></li> | |
| <li><a href="#ParsePublicKey">func ParsePublicKey(in []byte) (out PublicKey, err error)</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#RejectionReason">type RejectionReason</a> | |
| <ul> | |
| <li><a href="#RejectionReason.String">func (r RejectionReason) String() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Request">type Request</a> | |
| <ul> | |
| <li><a href="#Request.Reply">func (r *Request) Reply(ok bool, payload []byte) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#RequestHandler">type RequestHandler</a> | |
| </li> | |
| <li> | |
| <a href="#RequestHandlerFunc">type RequestHandlerFunc</a> | |
| <ul> | |
| <li><a href="#RequestHandlerFunc.NewRequest">func (f RequestHandlerFunc) NewRequest(req *Request)</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Server">type Server</a> | |
| <ul> | |
| <li><a href="#Server.AddHostKey">func (s *Server) AddHostKey(key Signer)</a></li> | |
| <li><a href="#Server.Close">func (s *Server) Close() error</a></li> | |
| <li><a href="#Server.ListenAndServe">func (s *Server) ListenAndServe(addr string) error</a></li> | |
| <li><a href="#Server.Serve">func (s *Server) Serve(l net.Listener) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#ServerAuthCallbacks">type ServerAuthCallbacks</a> | |
| </li> | |
| <li> | |
| <a href="#ServerAuthError">type ServerAuthError</a> | |
| <ul> | |
| <li><a href="#ServerAuthError.Error">func (l ServerAuthError) Error() string</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#ServerConn">type ServerConn</a> | |
| <ul> | |
| <li><a href="#NewServerConn">func NewServerConn(ctx context.Context, c net.Conn, config *Server) (*ServerConn, error)</a></li> | |
| <li><a href="#ServerConn.Close">func (c *ServerConn) Close() error</a></li> | |
| <li><a href="#ServerConn.Handle">func (c *ServerConn) Handle(channelHandler ChannelHandler, requestHandler RequestHandler) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Session">type Session</a> | |
| <ul> | |
| <li><a href="#Session.Close">func (s *Session) Close() error</a></li> | |
| <li><a href="#Session.CombinedOutput">func (s *Session) CombinedOutput(cmd string) ([]byte, error)</a></li> | |
| <li><a href="#Session.Output">func (s *Session) Output(cmd string) ([]byte, error)</a></li> | |
| <li><a href="#Session.RequestPty">func (s *Session) RequestPty(term string, h, w int, termmodes TerminalModes) error</a></li> | |
| <li><a href="#Session.RequestSubsystem">func (s *Session) RequestSubsystem(subsystem string) error</a></li> | |
| <li><a href="#Session.Run">func (s *Session) Run(cmd string) error</a></li> | |
| <li><a href="#Session.SendRequest">func (s *Session) SendRequest(name string, wantReply bool, payload []byte) (bool, error)</a></li> | |
| <li><a href="#Session.Setenv">func (s *Session) Setenv(name, value string) error</a></li> | |
| <li><a href="#Session.Shell">func (s *Session) Shell() error</a></li> | |
| <li><a href="#Session.Signal">func (s *Session) Signal(sig Signal) error</a></li> | |
| <li><a href="#Session.Start">func (s *Session) Start(cmd string) error</a></li> | |
| <li><a href="#Session.StderrPipe">func (s *Session) StderrPipe() (io.Reader, error)</a></li> | |
| <li><a href="#Session.StdinPipe">func (s *Session) StdinPipe() (io.WriteCloser, error)</a></li> | |
| <li><a href="#Session.StdoutPipe">func (s *Session) StdoutPipe() (io.Reader, error)</a></li> | |
| <li><a href="#Session.Wait">func (s *Session) Wait() error</a></li> | |
| <li><a href="#Session.WindowChange">func (s *Session) WindowChange(h, w int) error</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#Signal">type Signal</a> | |
| </li> | |
| <li> | |
| <a href="#Signature">type Signature</a> | |
| </li> | |
| <li> | |
| <a href="#Signer">type Signer</a> | |
| <ul> | |
| <li><a href="#NewCertSigner">func NewCertSigner(cert *Certificate, signer Signer) (Signer, error)</a></li> | |
| <li><a href="#NewSigner">func NewSigner(signer crypto.Signer) (Signer, error)</a></li> | |
| <li><a href="#NewSignerWithAlgorithms">func NewSignerWithAlgorithms(signer Signer, algorithms []string) (Signer, error)</a></li> | |
| </ul> | |
| </li> | |
| <li> | |
| <a href="#TerminalModes">type TerminalModes</a> | |
| </li> | |
| <li> | |
| <a href="#Waitmsg">type Waitmsg</a> | |
| <ul> | |
| <li><a href="#Waitmsg.ExitStatus">func (w Waitmsg) ExitStatus() int</a></li> | |
| <li><a href="#Waitmsg.Lang">func (w Waitmsg) Lang() string</a></li> | |
| <li><a href="#Waitmsg.Msg">func (w Waitmsg) Msg() string</a></li> | |
| <li><a href="#Waitmsg.Signal">func (w Waitmsg) Signal() string</a></li> | |
| <li><a href="#Waitmsg.String">func (w Waitmsg) String() string</a></li> | |
| </ul> | |
| </li> | |
| </ul><h4 id="pkg-examples">Examples</h4> | |
| <ul> | |
| <li><a href="#example-Certificate.SignCert">Certificate.SignCert</a></li> | |
| <li><a href="#example-Client.Listen">Client.Listen</a></li> | |
| <li><a href="#example-Dial">Dial</a></li> | |
| <li><a href="#example-NewServerConn">NewServerConn</a></li> | |
| <li><a href="#example-PublicKeys">PublicKeys</a></li> | |
| <li><a href="#example-RetryableAuthMethod">RetryableAuthMethod</a></li> | |
| <li><a href="#example-Server.AddHostKey">Server.AddHostKey</a></li> | |
| <li><a href="#example-Server.ListenAndServe">Server.ListenAndServe</a></li> | |
| <li><a href="#example-Session.RequestPty">Session.RequestPty</a></li> | |
| </ul><h3 id="pkg-constants">Constants</h3> | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="CertAlgoRSAv01"><span class="nx">CertAlgoRSAv01</span></span> <span class="p">=</span> <span class="s">"ssh-rsa-cert-v01@openssh.com"</span> | |
| <span id="CertAlgoECDSA256v01"><span class="nx">CertAlgoECDSA256v01</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp256-cert-v01@openssh.com"</span> | |
| <span id="CertAlgoECDSA384v01"><span class="nx">CertAlgoECDSA384v01</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp384-cert-v01@openssh.com"</span> | |
| <span id="CertAlgoECDSA521v01"><span class="nx">CertAlgoECDSA521v01</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp521-cert-v01@openssh.com"</span> | |
| <span id="CertAlgoSKECDSA256v01"><span class="nx">CertAlgoSKECDSA256v01</span></span> <span class="p">=</span> <span class="s">"sk-ecdsa-sha2-nistp256-cert-v01@openssh.com"</span> | |
| <span id="CertAlgoED25519v01"><span class="nx">CertAlgoED25519v01</span></span> <span class="p">=</span> <span class="s">"ssh-ed25519-cert-v01@openssh.com"</span> | |
| <span id="CertAlgoSKED25519v01"><span class="nx">CertAlgoSKED25519v01</span></span> <span class="p">=</span> <span class="s">"sk-ssh-ed25519-cert-v01@openssh.com"</span> | |
| <span class="c1">// CertAlgoRSASHA256v01 and CertAlgoRSASHA512v01 can't appear as a | |
| </span><span class="c1"></span> <span class="c1">// Certificate.Type (or PublicKey.Type), but only in | |
| </span><span class="c1"></span> <span class="c1">// ClientConfig.HostKeyAlgorithms. | |
| </span><span class="c1"></span> <span id="CertAlgoRSASHA256v01"><span class="nx">CertAlgoRSASHA256v01</span></span> <span class="p">=</span> <span class="s">"rsa-sha2-256-cert-v01@openssh.com"</span> | |
| <span id="CertAlgoRSASHA512v01"><span class="nx">CertAlgoRSASHA512v01</span></span> <span class="p">=</span> <span class="s">"rsa-sha2-512-cert-v01@openssh.com"</span> | |
| <span class="p">)</span></pre> | |
| <p>Certificate algorithm names from [PROTOCOL.certkeys]. These values can appear | |
| in Certificate.Type, PublicKey.Type, and ClientConfig.HostKeyAlgorithms. | |
| Unlike key algorithm names, these are not passed to AlgorithmSigner nor | |
| returned by MultiAlgorithmSigner and don't appear in the Signature.Format | |
| field. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="UserCert"><span class="nx">UserCert</span></span> <span class="p">=</span> <span class="mi">1</span> | |
| <span id="HostCert"><span class="nx">HostCert</span></span> <span class="p">=</span> <span class="mi">2</span> | |
| <span class="p">)</span></pre> | |
| <p>Certificate types distinguish between host and user | |
| certificates. The values can be set in the CertType field of | |
| Certificate. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="CipherAES128GCM"><span class="nx">CipherAES128GCM</span></span> <span class="p">=</span> <span class="s">"aes128-gcm@openssh.com"</span> | |
| <span id="CipherAES256GCM"><span class="nx">CipherAES256GCM</span></span> <span class="p">=</span> <span class="s">"aes256-gcm@openssh.com"</span> | |
| <span id="CipherChacha20Poly1305"><span class="nx">CipherChacha20Poly1305</span></span> <span class="p">=</span> <span class="s">"chacha20-poly1305@openssh.com"</span> | |
| <span id="CipherAES128CTR"><span class="nx">CipherAES128CTR</span></span> <span class="p">=</span> <span class="s">"aes128-ctr"</span> | |
| <span id="CipherAES192CTR"><span class="nx">CipherAES192CTR</span></span> <span class="p">=</span> <span class="s">"aes192-ctr"</span> | |
| <span id="CipherAES256CTR"><span class="nx">CipherAES256CTR</span></span> <span class="p">=</span> <span class="s">"aes256-ctr"</span> | |
| <span id="InsecureCipherAES128CBC"><span class="nx">InsecureCipherAES128CBC</span></span> <span class="p">=</span> <span class="s">"aes128-cbc"</span> | |
| <span id="InsecureCipherTripleDESCBC"><span class="nx">InsecureCipherTripleDESCBC</span></span> <span class="p">=</span> <span class="s">"3des-cbc"</span> | |
| <span id="InsecureCipherRC4"><span class="nx">InsecureCipherRC4</span></span> <span class="p">=</span> <span class="s">"arcfour"</span> | |
| <span id="InsecureCipherRC4128"><span class="nx">InsecureCipherRC4128</span></span> <span class="p">=</span> <span class="s">"arcfour128"</span> | |
| <span id="InsecureCipherRC4256"><span class="nx">InsecureCipherRC4256</span></span> <span class="p">=</span> <span class="s">"arcfour256"</span> | |
| <span class="p">)</span></pre> | |
| <p>Implemented ciphers algorithms. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="InsecureKeyExchangeDH1SHA1"><span class="nx">InsecureKeyExchangeDH1SHA1</span></span> <span class="p">=</span> <span class="s">"diffie-hellman-group1-sha1"</span> | |
| <span id="InsecureKeyExchangeDH14SHA1"><span class="nx">InsecureKeyExchangeDH14SHA1</span></span> <span class="p">=</span> <span class="s">"diffie-hellman-group14-sha1"</span> | |
| <span id="KeyExchangeDH14SHA256"><span class="nx">KeyExchangeDH14SHA256</span></span> <span class="p">=</span> <span class="s">"diffie-hellman-group14-sha256"</span> | |
| <span id="KeyExchangeDH16SHA512"><span class="nx">KeyExchangeDH16SHA512</span></span> <span class="p">=</span> <span class="s">"diffie-hellman-group16-sha512"</span> | |
| <span id="KeyExchangeECDHP256"><span class="nx">KeyExchangeECDHP256</span></span> <span class="p">=</span> <span class="s">"ecdh-sha2-nistp256"</span> | |
| <span id="KeyExchangeECDHP384"><span class="nx">KeyExchangeECDHP384</span></span> <span class="p">=</span> <span class="s">"ecdh-sha2-nistp384"</span> | |
| <span id="KeyExchangeECDHP521"><span class="nx">KeyExchangeECDHP521</span></span> <span class="p">=</span> <span class="s">"ecdh-sha2-nistp521"</span> | |
| <span id="KeyExchangeCurve25519SHA256"><span class="nx">KeyExchangeCurve25519SHA256</span></span> <span class="p">=</span> <span class="s">"curve25519-sha256"</span> | |
| <span id="InsecureKeyExchangeDHGEXSHA1"><span class="nx">InsecureKeyExchangeDHGEXSHA1</span></span> <span class="p">=</span> <span class="s">"diffie-hellman-group-exchange-sha1"</span> | |
| <span id="KeyExchangeDHGEXSHA256"><span class="nx">KeyExchangeDHGEXSHA256</span></span> <span class="p">=</span> <span class="s">"diffie-hellman-group-exchange-sha256"</span> | |
| <span class="p">)</span></pre> | |
| <p>Implemented key exchanges algorithms. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="HMACSHA256ETM"><span class="nx">HMACSHA256ETM</span></span> <span class="p">=</span> <span class="s">"hmac-sha2-256-etm@openssh.com"</span> | |
| <span id="HMACSHA512ETM"><span class="nx">HMACSHA512ETM</span></span> <span class="p">=</span> <span class="s">"hmac-sha2-512-etm@openssh.com"</span> | |
| <span id="HMACSHA256"><span class="nx">HMACSHA256</span></span> <span class="p">=</span> <span class="s">"hmac-sha2-256"</span> | |
| <span id="HMACSHA512"><span class="nx">HMACSHA512</span></span> <span class="p">=</span> <span class="s">"hmac-sha2-512"</span> | |
| <span id="InsecureHMACSHA1"><span class="nx">InsecureHMACSHA1</span></span> <span class="p">=</span> <span class="s">"hmac-sha1"</span> | |
| <span id="InsecureHMACSHA196"><span class="nx">InsecureHMACSHA196</span></span> <span class="p">=</span> <span class="s">"hmac-sha1-96"</span> | |
| <span class="p">)</span></pre> | |
| <p>Implemented message authentication code (MAC) algorithms. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="KeyTypeRSA"><span class="nx">KeyTypeRSA</span></span> <span class="p">=</span> <span class="s">"ssh-rsa"</span> | |
| <span id="KeyTypeECDSA256"><span class="nx">KeyTypeECDSA256</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp256"</span> | |
| <span id="KeyTypeECDSA384"><span class="nx">KeyTypeECDSA384</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp384"</span> | |
| <span id="KeyTypeECDSA521"><span class="nx">KeyTypeECDSA521</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp521"</span> | |
| <span id="KeyTypeSKECDSA256"><span class="nx">KeyTypeSKECDSA256</span></span> <span class="p">=</span> <span class="s">"sk-ecdsa-sha2-nistp256@openssh.com"</span> | |
| <span id="KeyTypeED25519"><span class="nx">KeyTypeED25519</span></span> <span class="p">=</span> <span class="s">"ssh-ed25519"</span> | |
| <span id="KeyTypeSKED25519"><span class="nx">KeyTypeSKED25519</span></span> <span class="p">=</span> <span class="s">"sk-ssh-ed25519@openssh.com"</span> | |
| <span class="p">)</span></pre> | |
| <p>Implemented public key types. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="KeyAlgoRSA"><span class="nx">KeyAlgoRSA</span></span> <span class="p">=</span> <span class="s">"ssh-rsa"</span> | |
| <span id="KeyAlgoECDSA256"><span class="nx">KeyAlgoECDSA256</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp256"</span> | |
| <span id="KeyAlgoSKECDSA256"><span class="nx">KeyAlgoSKECDSA256</span></span> <span class="p">=</span> <span class="s">"sk-ecdsa-sha2-nistp256@openssh.com"</span> | |
| <span id="KeyAlgoECDSA384"><span class="nx">KeyAlgoECDSA384</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp384"</span> | |
| <span id="KeyAlgoECDSA521"><span class="nx">KeyAlgoECDSA521</span></span> <span class="p">=</span> <span class="s">"ecdsa-sha2-nistp521"</span> | |
| <span id="KeyAlgoED25519"><span class="nx">KeyAlgoED25519</span></span> <span class="p">=</span> <span class="s">"ssh-ed25519"</span> | |
| <span id="KeyAlgoSKED25519"><span class="nx">KeyAlgoSKED25519</span></span> <span class="p">=</span> <span class="s">"sk-ssh-ed25519@openssh.com"</span> | |
| <span class="c1">// KeyAlgoRSASHA256 and KeyAlgoRSASHA512 are only public key algorithms, not | |
| </span><span class="c1"></span> <span class="c1">// public key formats, so they can't appear as a PublicKey.Type. The | |
| </span><span class="c1"></span> <span class="c1">// corresponding PublicKey.Type is KeyAlgoRSA. See RFC 8332, Section 2. | |
| </span><span class="c1"></span> <span id="KeyAlgoRSASHA256"><span class="nx">KeyAlgoRSASHA256</span></span> <span class="p">=</span> <span class="s">"rsa-sha2-256"</span> | |
| <span id="KeyAlgoRSASHA512"><span class="nx">KeyAlgoRSASHA512</span></span> <span class="p">=</span> <span class="s">"rsa-sha2-512"</span> | |
| <span class="p">)</span></pre> | |
| <p>Public key algorithms names. These values can appear in PublicKey.Type, | |
| ClientConfig.HostKeyAlgorithms, Signature.Format, or as AlgorithmSigner | |
| arguments. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="VINTR"><span class="nx">VINTR</span></span> <span class="p">=</span> <span class="mi">1</span> | |
| <span id="VQUIT"><span class="nx">VQUIT</span></span> <span class="p">=</span> <span class="mi">2</span> | |
| <span id="VERASE"><span class="nx">VERASE</span></span> <span class="p">=</span> <span class="mi">3</span> | |
| <span id="VKILL"><span class="nx">VKILL</span></span> <span class="p">=</span> <span class="mi">4</span> | |
| <span id="VEOF"><span class="nx">VEOF</span></span> <span class="p">=</span> <span class="mi">5</span> | |
| <span id="VEOL"><span class="nx">VEOL</span></span> <span class="p">=</span> <span class="mi">6</span> | |
| <span id="VEOL2"><span class="nx">VEOL2</span></span> <span class="p">=</span> <span class="mi">7</span> | |
| <span id="VSTART"><span class="nx">VSTART</span></span> <span class="p">=</span> <span class="mi">8</span> | |
| <span id="VSTOP"><span class="nx">VSTOP</span></span> <span class="p">=</span> <span class="mi">9</span> | |
| <span id="VSUSP"><span class="nx">VSUSP</span></span> <span class="p">=</span> <span class="mi">10</span> | |
| <span id="VDSUSP"><span class="nx">VDSUSP</span></span> <span class="p">=</span> <span class="mi">11</span> | |
| <span id="VREPRINT"><span class="nx">VREPRINT</span></span> <span class="p">=</span> <span class="mi">12</span> | |
| <span id="VWERASE"><span class="nx">VWERASE</span></span> <span class="p">=</span> <span class="mi">13</span> | |
| <span id="VLNEXT"><span class="nx">VLNEXT</span></span> <span class="p">=</span> <span class="mi">14</span> | |
| <span id="VFLUSH"><span class="nx">VFLUSH</span></span> <span class="p">=</span> <span class="mi">15</span> | |
| <span id="VSWTCH"><span class="nx">VSWTCH</span></span> <span class="p">=</span> <span class="mi">16</span> | |
| <span id="VSTATUS"><span class="nx">VSTATUS</span></span> <span class="p">=</span> <span class="mi">17</span> | |
| <span id="VDISCARD"><span class="nx">VDISCARD</span></span> <span class="p">=</span> <span class="mi">18</span> | |
| <span id="IGNPAR"><span class="nx">IGNPAR</span></span> <span class="p">=</span> <span class="mi">30</span> | |
| <span id="PARMRK"><span class="nx">PARMRK</span></span> <span class="p">=</span> <span class="mi">31</span> | |
| <span id="INPCK"><span class="nx">INPCK</span></span> <span class="p">=</span> <span class="mi">32</span> | |
| <span id="ISTRIP"><span class="nx">ISTRIP</span></span> <span class="p">=</span> <span class="mi">33</span> | |
| <span id="INLCR"><span class="nx">INLCR</span></span> <span class="p">=</span> <span class="mi">34</span> | |
| <span id="IGNCR"><span class="nx">IGNCR</span></span> <span class="p">=</span> <span class="mi">35</span> | |
| <span id="ICRNL"><span class="nx">ICRNL</span></span> <span class="p">=</span> <span class="mi">36</span> | |
| <span id="IUCLC"><span class="nx">IUCLC</span></span> <span class="p">=</span> <span class="mi">37</span> | |
| <span id="IXON"><span class="nx">IXON</span></span> <span class="p">=</span> <span class="mi">38</span> | |
| <span id="IXANY"><span class="nx">IXANY</span></span> <span class="p">=</span> <span class="mi">39</span> | |
| <span id="IXOFF"><span class="nx">IXOFF</span></span> <span class="p">=</span> <span class="mi">40</span> | |
| <span id="IMAXBEL"><span class="nx">IMAXBEL</span></span> <span class="p">=</span> <span class="mi">41</span> | |
| <span id="IUTF8"><span class="nx">IUTF8</span></span> <span class="p">=</span> <span class="mi">42</span> <span class="c1">// RFC 8160 | |
| </span><span class="c1"></span> <span id="ISIG"><span class="nx">ISIG</span></span> <span class="p">=</span> <span class="mi">50</span> | |
| <span id="ICANON"><span class="nx">ICANON</span></span> <span class="p">=</span> <span class="mi">51</span> | |
| <span id="XCASE"><span class="nx">XCASE</span></span> <span class="p">=</span> <span class="mi">52</span> | |
| <span id="ECHO"><span class="nx">ECHO</span></span> <span class="p">=</span> <span class="mi">53</span> | |
| <span id="ECHOE"><span class="nx">ECHOE</span></span> <span class="p">=</span> <span class="mi">54</span> | |
| <span id="ECHOK"><span class="nx">ECHOK</span></span> <span class="p">=</span> <span class="mi">55</span> | |
| <span id="ECHONL"><span class="nx">ECHONL</span></span> <span class="p">=</span> <span class="mi">56</span> | |
| <span id="NOFLSH"><span class="nx">NOFLSH</span></span> <span class="p">=</span> <span class="mi">57</span> | |
| <span id="TOSTOP"><span class="nx">TOSTOP</span></span> <span class="p">=</span> <span class="mi">58</span> | |
| <span id="IEXTEN"><span class="nx">IEXTEN</span></span> <span class="p">=</span> <span class="mi">59</span> | |
| <span id="ECHOCTL"><span class="nx">ECHOCTL</span></span> <span class="p">=</span> <span class="mi">60</span> | |
| <span id="ECHOKE"><span class="nx">ECHOKE</span></span> <span class="p">=</span> <span class="mi">61</span> | |
| <span id="PENDIN"><span class="nx">PENDIN</span></span> <span class="p">=</span> <span class="mi">62</span> | |
| <span id="OPOST"><span class="nx">OPOST</span></span> <span class="p">=</span> <span class="mi">70</span> | |
| <span id="OLCUC"><span class="nx">OLCUC</span></span> <span class="p">=</span> <span class="mi">71</span> | |
| <span id="ONLCR"><span class="nx">ONLCR</span></span> <span class="p">=</span> <span class="mi">72</span> | |
| <span id="OCRNL"><span class="nx">OCRNL</span></span> <span class="p">=</span> <span class="mi">73</span> | |
| <span id="ONOCR"><span class="nx">ONOCR</span></span> <span class="p">=</span> <span class="mi">74</span> | |
| <span id="ONLRET"><span class="nx">ONLRET</span></span> <span class="p">=</span> <span class="mi">75</span> | |
| <span id="CS7"><span class="nx">CS7</span></span> <span class="p">=</span> <span class="mi">90</span> | |
| <span id="CS8"><span class="nx">CS8</span></span> <span class="p">=</span> <span class="mi">91</span> | |
| <span id="PARENB"><span class="nx">PARENB</span></span> <span class="p">=</span> <span class="mi">92</span> | |
| <span id="PARODD"><span class="nx">PARODD</span></span> <span class="p">=</span> <span class="mi">93</span> | |
| <span id="TTY_OP_ISPEED"><span class="nx">TTY_OP_ISPEED</span></span> <span class="p">=</span> <span class="mi">128</span> | |
| <span id="TTY_OP_OSPEED"><span class="nx">TTY_OP_OSPEED</span></span> <span class="p">=</span> <span class="mi">129</span> | |
| <span class="p">)</span></pre> | |
| <p>POSIX terminal mode flags as listed in RFC 4254 Section 8. | |
| <pre class="chroma"><span class="kd">const</span> <span id="CertTimeInfinity"><span class="nx">CertTimeInfinity</span></span> <span class="p">=</span> <span class="mi">1</span><span class="o"><<</span><span class="mi">64</span> <span class="o">-</span> <span class="mi">1</span></pre> | |
| <p>CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that | |
| a certificate does not expire. | |
| <h3 id="pkg-variables">Variables</h3> | |
| <pre class="chroma"><span class="kd">var</span> <span id="ErrNoAuth"><span class="nx">ErrNoAuth</span></span> <span class="p">=</span> <a href="https://pkg.go.dev/errors"><span class="nx">errors</span></a><span class="p">.</span><a href="https://pkg.go.dev/errors#New"><span class="nf">New</span></a><span class="p">(</span><span class="s">"ssh: no auth passed yet"</span><span class="p">)</span></pre> | |
| <p>ErrNoAuth is the error value returned if no | |
| authentication method has been passed yet. This happens as a normal | |
| part of the authentication loop, since the client first tries | |
| 'none' authentication to discover available methods. | |
| It is returned in ServerAuthError.Errors from NewServerConn. | |
| <h3 id="pkg-functions">Functions</h3> | |
| <h3 id="FingerprintLegacyMD5">func FingerprintLegacyMD5</h3> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">FingerprintLegacyMD5</span><span class="p">(</span><span class="nx">pubKey</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>FingerprintLegacyMD5 returns the user presentation of the key's | |
| fingerprint as described by RFC 4716 section 4. | |
| <h3 id="FingerprintSHA256">func FingerprintSHA256</h3> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">FingerprintSHA256</span><span class="p">(</span><span class="nx">pubKey</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>FingerprintSHA256 returns the user presentation of the key's | |
| fingerprint as unpadded base64 encoded sha256 hash. | |
| This format was introduced from OpenSSH 6.8. | |
| <a href="https://www.openssh.com/txt/release-6.8">https://www.openssh.com/txt/release-6.8</a> | |
| <a href="https://tools.ietf.org/html/rfc4648#section-3.2">https://tools.ietf.org/html/rfc4648#section-3.2</a> (unpadded base64 encoding) | |
| <h3 id="Marshal">func Marshal</h3> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">Marshal</span><span class="p">(</span><span class="nx">msg</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a></pre> | |
| <p>Marshal serializes the message in msg to SSH wire format. The msg | |
| argument should be a struct or pointer to struct. If the first | |
| member has the "sshtype" tag set to a number in decimal, that | |
| number is prepended to the result. If the last of member has the | |
| "ssh" tag set to "rest", its contents are appended to the output. | |
| <h3 id="MarshalAuthorizedKey">func MarshalAuthorizedKey</h3> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">MarshalAuthorizedKey</span><span class="p">(</span><span class="nx">key</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a></pre> | |
| <p>MarshalAuthorizedKey serializes key for inclusion in an OpenSSH | |
| authorized_keys file. The return value ends with newline. | |
| <h3 id="MarshalPrivateKey">func MarshalPrivateKey</h3> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">MarshalPrivateKey</span><span class="p">(</span><span class="nx">key</span> <a href="https://pkg.go.dev/crypto"><span class="nx">crypto</span></a><span class="p">.</span><a href="https://pkg.go.dev/crypto#PrivateKey"><span class="nx">PrivateKey</span></a><span class="p">,</span> <span class="nx">options</span> <a href="#MarshalPrivateKeyOptions"><span class="nx">MarshalPrivateKeyOptions</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="https://pkg.go.dev/encoding/pem"><span class="nx">pem</span></a><span class="p">.</span><a href="https://pkg.go.dev/encoding/pem#Block"><span class="nx">Block</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>MarshalPrivateKey returns a PEM block with the private key serialized in the | |
| OpenSSH format. | |
| <h3 id="Unmarshal">func Unmarshal</h3> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">data</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">out</span> <span class="kd">interface</span><span class="p">{})</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Unmarshal parses data in SSH wire format into a structure. The out | |
| argument should be a pointer to struct. If the first member of the | |
| struct has the "sshtype" tag set to a '|'-separated set of numbers | |
| in decimal, the packet must start with one of those numbers. In | |
| case of error, Unmarshal returns a ParseError or | |
| UnexpectedMessageError. | |
| <h3 id="pkg-types">Types</h3> | |
| <h3 id="Algorithms">type Algorithms</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Algorithms</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span id="Algorithms.KeyExchanges"><span class="nx">KeyExchanges</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Algorithms.Ciphers"><span class="nx">Ciphers</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Algorithms.MACs"><span class="nx">MACs</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Algorithms.HostKeys"><span class="nx">HostKeys</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Algorithms.PublicKeyAuths"><span class="nx">PublicKeyAuths</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="p">}</span></pre> | |
| <p>Algorithms defines a set of algorithms that can be configured in the client | |
| or server config for negotiation during a handshake. | |
| <h4 id="InsecureAlgorithms">func InsecureAlgorithms</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">InsecureAlgorithms</span><span class="p">()</span> <a href="#Algorithms"><span class="nx">Algorithms</span></a></pre> | |
| <p>InsecureAlgorithms returns algorithms currently implemented by this package | |
| and which have security issues. | |
| <h4 id="SupportedAlgorithms">func SupportedAlgorithms</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">SupportedAlgorithms</span><span class="p">()</span> <a href="#Algorithms"><span class="nx">Algorithms</span></a></pre> | |
| <p>SupportedAlgorithms returns algorithms currently implemented by this package, | |
| excluding those with security issues, which are returned by | |
| InsecureAlgorithms. The algorithms listed here are in preference order. | |
| <h3 id="AuthMethod">type AuthMethod</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">AuthMethod</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span class="c1">// contains filtered or unexported methods | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>An AuthMethod represents an instance of an RFC 4252 authentication method. | |
| <h4 id="GSSAPIWithMICAuthMethod">func GSSAPIWithMICAuthMethod</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">GSSAPIWithMICAuthMethod</span><span class="p">(</span><span class="nx">gssAPIClient</span> <a href="#GSSAPIClient"><span class="nx">GSSAPIClient</span></a><span class="p">,</span> <span class="nx">target</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a></pre> | |
| <p>GSSAPIWithMICAuthMethod is an AuthMethod with "gssapi-with-mic" authentication. | |
| See RFC 4462 section 3 | |
| gssAPIClient is implementation of the GSSAPIClient interface, see the definition of the interface for details. | |
| target is the server host you want to log in to. | |
| <h4 id="KeyboardInteractive">func KeyboardInteractive</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">KeyboardInteractive</span><span class="p">(</span><span class="nx">challenge</span> <a href="#KeyboardInteractiveChallenge"><span class="nx">KeyboardInteractiveChallenge</span></a><span class="p">)</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a></pre> | |
| <p>KeyboardInteractive returns an AuthMethod using a prompt/response | |
| sequence controlled by the server. | |
| <h4 id="Password">func Password</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">Password</span><span class="p">(</span><span class="nx">secret</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a></pre> | |
| <p>Password returns an AuthMethod using the given password. | |
| <h4 id="PasswordCallback">func PasswordCallback</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">PasswordCallback</span><span class="p">(</span><span class="nx">prompt</span> <span class="kd">func</span><span class="p">()</span> <span class="p">(</span><span class="nx">secret</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">))</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a></pre> | |
| <p>PasswordCallback returns an AuthMethod that uses a callback for | |
| fetching a password. | |
| <h4 id="PublicKeys">func PublicKeys</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">PublicKeys</span><span class="p">(</span><span class="nx">signers</span> <span class="o">...</span><a href="#Signer"><span class="nx">Signer</span></a><span class="p">)</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a></pre> | |
| <p>PublicKeys returns an AuthMethod that uses the given key | |
| pairs. | |
| <details id="example-PublicKeys" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"context"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"os"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="kd">var</span> <span class="nx">hostKey</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">PublicKey</span> | |
| <span class="c1">// A public key may be used to authenticate against the remote | |
| </span><span class="c1"></span> <span class="c1">// server by using an unencrypted PEM-encoded private key file. | |
| </span><span class="c1"></span> <span class="c1">// | |
| </span><span class="c1"></span> <span class="c1">// If you have an encrypted private key, the crypto/x509 package | |
| </span><span class="c1"></span> <span class="c1">// can be used to decrypt it. | |
| </span><span class="c1"></span> <span class="nx">key</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">"/home/user/.ssh/id_rsa"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"unable to read private key: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Create the Signer for this private key. | |
| </span><span class="c1"></span> <span class="nx">signer</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">ParsePrivateKey</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"unable to parse private key: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">ClientConfig</span><span class="p">{</span> | |
| <span class="nx">User</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> | |
| <span class="nx">Auth</span><span class="p">:</span> <span class="p">[]</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">AuthMethod</span><span class="p">{</span> | |
| <span class="c1">// Use the PublicKeys method for remote authentication. | |
| </span><span class="c1"></span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">PublicKeys</span><span class="p">(</span><span class="nx">signer</span><span class="p">),</span> | |
| <span class="p">},</span> | |
| <span class="nx">HostKey</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">FixedHostKey</span><span class="p">(</span><span class="nx">hostKey</span><span class="p">),</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Connect to the remote server and perform the SSH handshake. | |
| </span><span class="c1"></span> <span class="nx">client</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">Dial</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">(),</span> <span class="s">"tcp"</span><span class="p">,</span> <span class="s">"host.com:22"</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"unable to connect: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="k">defer</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="PublicKeysCallback">func PublicKeysCallback</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">PublicKeysCallback</span><span class="p">(</span><span class="nx">getSigners</span> <span class="kd">func</span><span class="p">()</span> <span class="p">(</span><span class="nx">signers</span> <span class="p">[]</span><a href="#Signer"><span class="nx">Signer</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">))</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a></pre> | |
| <p>PublicKeysCallback returns an AuthMethod that runs the given | |
| function to obtain a list of key pairs. | |
| <h4 id="RetryableAuthMethod">func RetryableAuthMethod</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">RetryableAuthMethod</span><span class="p">(</span><span class="nx">auth</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a><span class="p">,</span> <span class="nx">maxTries</span> <a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a><span class="p">)</span> <a href="#AuthMethod"><span class="nx">AuthMethod</span></a></pre> | |
| <p>RetryableAuthMethod is a decorator for other auth methods enabling them to | |
| be retried up to maxTries before considering that AuthMethod itself failed. | |
| If maxTries is <= 0, will retry indefinitely | |
| <p>This is useful for interactive clients using challenge/response type | |
| authentication (e.g. Keyboard-Interactive, Password, etc) where the user | |
| could mistype their response resulting in the server issuing a | |
| SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4 | |
| [keyboard-interactive]); Without this decorator, the non-retryable | |
| AuthMethod would be removed from future consideration, and never tried again | |
| (and so the user would never be able to retry their entry). | |
| <details id="example-RetryableAuthMethod" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="nx">user</span> <span class="o">:=</span> <span class="s">"testuser"</span> | |
| <span class="nx">NumberOfPrompts</span> <span class="o">:=</span> <span class="mi">3</span> | |
| <span class="c1">// Normally this would be a callback that prompts the user to answer the | |
| </span><span class="c1">// provided questions | |
| </span><span class="c1"></span><span class="nx">Cb</span> <span class="o">:=</span> <span class="kd">func</span><span class="p">(</span><span class="nx">user</span><span class="p">,</span> <span class="nx">instruction</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">questions</span> <span class="p">[]</span><span class="kt">string</span><span class="p">,</span> <span class="nx">echos</span> <span class="p">[]</span><span class="kt">bool</span><span class="p">)</span> <span class="p">(</span><span class="nx">answers</span> <span class="p">[]</span><span class="kt">string</span><span class="p">,</span> <span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="k">return</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"answer1"</span><span class="p">,</span> <span class="s">"answer2"</span><span class="p">},</span> <span class="kc">nil</span> | |
| <span class="p">}</span> | |
| <span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ClientConfig</span><span class="p">{</span> | |
| <span class="nx">HostKey</span><span class="p">:</span> <span class="nf">InsecureIgnoreHostKey</span><span class="p">(),</span> | |
| <span class="nx">User</span><span class="p">:</span> <span class="nx">user</span><span class="p">,</span> | |
| <span class="nx">Auth</span><span class="p">:</span> <span class="p">[]</span><span class="nx">AuthMethod</span><span class="p">{</span> | |
| <span class="nf">RetryableAuthMethod</span><span class="p">(</span><span class="nf">KeyboardInteractiveChallenge</span><span class="p">(</span><span class="nx">Cb</span><span class="p">),</span> <span class="nx">NumberOfPrompts</span><span class="p">),</span> | |
| <span class="p">},</span> | |
| <span class="p">}</span> | |
| <span class="nx">host</span> <span class="o">:=</span> <span class="s">"mysshserver"</span> | |
| <span class="nx">netConn</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">net</span><span class="p">.</span><span class="nf">Dial</span><span class="p">(</span><span class="s">"tcp"</span><span class="p">,</span> <span class="nx">host</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">sshConn</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nf">NewClientConn</span><span class="p">(</span><span class="nx">netConn</span><span class="p">,</span> <span class="nx">host</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">_</span> <span class="p">=</span> <span class="nx">sshConn</span></pre> | |
| </details> | |
| <h3 id="BannerCallback">type BannerCallback</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">BannerCallback</span> <span class="kd">func</span><span class="p">(</span><span class="nx">message</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>BannerCallback is the function type used for treat the banner sent by | |
| the server. A BannerCallback receives the message sent by the remote server. | |
| <h4 id="BannerDisplayStderr">func BannerDisplayStderr</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">BannerDisplayStderr</span><span class="p">()</span> <a href="#BannerCallback"><span class="nx">BannerCallback</span></a></pre> | |
| <p>BannerDisplayStderr returns a function that can be used for | |
| ClientConfig.BannerCallback to display banners on os.Stderr. | |
| <h3 id="BannerError">type BannerError</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">BannerError</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span id="BannerError.Err"><span class="nx">Err</span></span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a> | |
| <span id="BannerError.Message"><span class="nx">Message</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="p">}</span></pre> | |
| <p>BannerError is an error that can be returned by authentication handlers in | |
| Server to send a banner message to the client. | |
| <h4 id="BannerError.Error">func (*BannerError) Error</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><a href="#BannerError"><span class="nx">BannerError</span></a><span class="p">)</span> <span class="nf">Error</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h4 id="BannerError.Unwrap">func (*BannerError) Unwrap</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><a href="#BannerError"><span class="nx">BannerError</span></a><span class="p">)</span> <span class="nf">Unwrap</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <h3 id="CertChecker">type CertChecker</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">CertChecker</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// SupportedCriticalOptions lists the CriticalOptions that the | |
| </span><span class="c1"></span> <span class="c1">// server application layer understands. These are only used | |
| </span><span class="c1"></span> <span class="c1">// for user certificates. | |
| </span><span class="c1"></span> <span id="CertChecker.SupportedCriticalOptions"><span class="nx">SupportedCriticalOptions</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// IsUserAuthority should return true if the key is recognized as an | |
| </span><span class="c1"></span> <span class="c1">// authority for the given user certificate. This allows for | |
| </span><span class="c1"></span> <span class="c1">// certificates to be signed by other certificates. This must be set | |
| </span><span class="c1"></span> <span class="c1">// if this CertChecker will be checking user certificates. | |
| </span><span class="c1"></span> <span id="CertChecker.IsUserAuthority"><span class="nx">IsUserAuthority</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">auth</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a> | |
| <span class="c1">// IsHostAuthority should report whether the key is recognized as | |
| </span><span class="c1"></span> <span class="c1">// an authority for this host. This allows for certificates to be | |
| </span><span class="c1"></span> <span class="c1">// signed by other keys, and for those other keys to only be valid | |
| </span><span class="c1"></span> <span class="c1">// signers for particular hostnames. This must be set if this | |
| </span><span class="c1"></span> <span class="c1">// CertChecker will be checking host certificates. | |
| </span><span class="c1"></span> <span id="CertChecker.IsHostAuthority"><span class="nx">IsHostAuthority</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">auth</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">,</span> <span class="nx">address</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a> | |
| <span class="c1">// Clock is used for verifying time stamps. If nil, time.Now | |
| </span><span class="c1"></span> <span class="c1">// is used. | |
| </span><span class="c1"></span> <span id="CertChecker.Clock"><span class="nx">Clock</span></span> <span class="kd">func</span><span class="p">()</span> <a href="https://pkg.go.dev/time"><span class="nx">time</span></a><span class="p">.</span><a href="https://pkg.go.dev/time#Time"><span class="nx">Time</span></a> | |
| <span class="c1">// UserKeyFallback is called when CertChecker.Authenticate encounters a | |
| </span><span class="c1"></span> <span class="c1">// public key that is not a certificate. It must implement validation | |
| </span><span class="c1"></span> <span class="c1">// of user keys or else, if nil, all such keys are rejected. | |
| </span><span class="c1"></span> <span id="CertChecker.UserKeyFallback"><span class="nx">UserKeyFallback</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">key</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// HostKeyFallback is called when CertChecker.CheckHostKey encounters a | |
| </span><span class="c1"></span> <span class="c1">// public key that is not a certificate. It must implement host key | |
| </span><span class="c1"></span> <span class="c1">// validation or else, if nil, all such keys are rejected. | |
| </span><span class="c1"></span> <span id="CertChecker.HostKeyFallback"><span class="nx">HostKeyFallback</span></span> <a href="#HostKeyCallback"><span class="nx">HostKeyCallback</span></a> | |
| <span class="c1">// IsRevoked is called for each certificate so that revocation checking | |
| </span><span class="c1"></span> <span class="c1">// can be implemented. It should return true if the given certificate | |
| </span><span class="c1"></span> <span class="c1">// is revoked and false otherwise. If nil, no certificates are | |
| </span><span class="c1"></span> <span class="c1">// considered to have been revoked. | |
| </span><span class="c1"></span> <span id="CertChecker.IsRevoked"><span class="nx">IsRevoked</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">cert</span> <span class="o">*</span><a href="#Certificate"><span class="nx">Certificate</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a> | |
| <span class="p">}</span></pre> | |
| <p>CertChecker does the work of verifying a certificate. Its methods | |
| can be plugged into ClientConfig.HostKeyCallback and | |
| Server.PublicKeyCallback. For the CertChecker to work, | |
| minimally, the IsAuthority callback should be set. | |
| <h4 id="CertChecker.Authenticate">func (*CertChecker) Authenticate</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#CertChecker"><span class="nx">CertChecker</span></a><span class="p">)</span> <span class="nf">Authenticate</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">pubKey</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Authenticate checks a user certificate. Authenticate can be used as | |
| a value for Server.PublicKeyCallback. | |
| <h4 id="CertChecker.CheckCert">func (*CertChecker) CheckCert</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#CertChecker"><span class="nx">CertChecker</span></a><span class="p">)</span> <span class="nf">CheckCert</span><span class="p">(</span><span class="nx">principal</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">cert</span> <span class="o">*</span><a href="#Certificate"><span class="nx">Certificate</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and | |
| the signature of the certificate. | |
| <h4 id="CertChecker.CheckHostKey">func (*CertChecker) CheckHostKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#CertChecker"><span class="nx">CertChecker</span></a><span class="p">)</span> <span class="nf">CheckHostKey</span><span class="p">(</span><span class="nx">addr</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">remote</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Addr"><span class="nx">Addr</span></a><span class="p">,</span> <span class="nx">key</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>CheckHostKey checks a host key certificate. This method can be | |
| plugged into ClientConfig.HostKeyCallback. | |
| <h3 id="Certificate">type Certificate</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Certificate</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span id="Certificate.Nonce"><span class="nx">Nonce</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a> | |
| <span id="Certificate.Key"><span class="nx">Key</span></span> <a href="#PublicKey"><span class="nx">PublicKey</span></a> | |
| <span id="Certificate.Serial"><span class="nx">Serial</span></span> <a href="https://pkg.go.dev/builtin#uint64"><span class="kt">uint64</span></a> | |
| <span id="Certificate.CertType"><span class="nx">CertType</span></span> <a href="https://pkg.go.dev/builtin#uint32"><span class="kt">uint32</span></a> | |
| <span id="Certificate.KeyId"><span class="nx">KeyId</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Certificate.ValidPrincipals"><span class="nx">ValidPrincipals</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Certificate.ValidAfter"><span class="nx">ValidAfter</span></span> <a href="https://pkg.go.dev/builtin#uint64"><span class="kt">uint64</span></a> | |
| <span id="Certificate.ValidBefore"><span class="nx">ValidBefore</span></span> <a href="https://pkg.go.dev/builtin#uint64"><span class="kt">uint64</span></a> | |
| <a href="#Permissions"><span class="nx">Permissions</span></a> | |
| <span id="Certificate.Reserved"><span class="nx">Reserved</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a> | |
| <span id="Certificate.SignatureKey"><span class="nx">SignatureKey</span></span> <a href="#PublicKey"><span class="nx">PublicKey</span></a> | |
| <span id="Certificate.Signature"><span class="nx">Signature</span></span> <span class="o">*</span><a href="#Signature"><span class="nx">Signature</span></a> | |
| <span class="p">}</span></pre> | |
| <p>An Certificate represents an OpenSSH certificate as defined in | |
| [PROTOCOL.certkeys]?rev=1.8. The Certificate type implements the | |
| PublicKey interface, so it can be unmarshaled using | |
| ParsePublicKey. | |
| <h4 id="Certificate.Marshal">func (*Certificate) Marshal</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Certificate"><span class="nx">Certificate</span></a><span class="p">)</span> <span class="nf">Marshal</span><span class="p">()</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a></pre> | |
| <p>Marshal serializes c into OpenSSH's wire format. It is part of the | |
| PublicKey interface. | |
| <h4 id="Certificate.SignCert">func (*Certificate) SignCert</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Certificate"><span class="nx">Certificate</span></a><span class="p">)</span> <span class="nf">SignCert</span><span class="p">(</span><span class="nx">rand</span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Reader"><span class="nx">Reader</span></a><span class="p">,</span> <span class="nx">authority</span> <a href="#Signer"><span class="nx">Signer</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>SignCert signs the certificate with an authority, setting the Nonce, | |
| SignatureKey, and Signature fields. If the authority implements the | |
| MultiAlgorithmSigner interface the first algorithm in the list is used. This | |
| is useful if you want to sign with a specific algorithm. | |
| <details id="example-Certificate.SignCert" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"crypto/rand"</span> | |
| <span class="s">"crypto/rsa"</span> | |
| <span class="s">"fmt"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="c1">// Sign a certificate with a specific algorithm. | |
| </span><span class="c1"></span> <span class="nx">privateKey</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">rsa</span><span class="p">.</span><span class="nf">GenerateKey</span><span class="p">(</span><span class="nx">rand</span><span class="p">.</span><span class="nx">Reader</span><span class="p">,</span> <span class="mi">3072</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to generate RSA key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">publicKey</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">NewPublicKey</span><span class="p">(</span><span class="o">&</span><span class="nx">privateKey</span><span class="p">.</span><span class="nx">PublicKey</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to get RSA public key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">caKey</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">rsa</span><span class="p">.</span><span class="nf">GenerateKey</span><span class="p">(</span><span class="nx">rand</span><span class="p">.</span><span class="nx">Reader</span><span class="p">,</span> <span class="mi">3072</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to generate CA key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">signer</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">NewSigner</span><span class="p">(</span><span class="nx">caKey</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to generate signer from key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">mas</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">NewSignerWithAlgorithms</span><span class="p">(</span><span class="nx">signer</span><span class="p">,</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">KeyAlgoRSASHA256</span><span class="p">})</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to create signer with algorithms: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">certificate</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">Certificate</span><span class="p">{</span> | |
| <span class="nx">Key</span><span class="p">:</span> <span class="nx">publicKey</span><span class="p">,</span> | |
| <span class="nx">CertType</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">UserCert</span><span class="p">,</span> | |
| <span class="p">}</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">certificate</span><span class="p">.</span><span class="nf">SignCert</span><span class="p">(</span><span class="nx">rand</span><span class="p">.</span><span class="nx">Reader</span><span class="p">,</span> <span class="nx">mas</span><span class="p">);</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to sign certificate: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Save the public key to a file and check that rsa-sha-256 is used for | |
| </span><span class="c1"></span> <span class="c1">// signing: | |
| </span><span class="c1"></span> <span class="c1">// ssh-keygen -L -f <path to the file> | |
| </span><span class="c1"></span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">ssh</span><span class="p">.</span><span class="nf">MarshalAuthorizedKey</span><span class="p">(</span><span class="o">&</span><span class="nx">certificate</span><span class="p">)))</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="Certificate.Type">func (*Certificate) Type</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Certificate"><span class="nx">Certificate</span></a><span class="p">)</span> <span class="nf">Type</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>Type returns the certificate algorithm name. It is part of the PublicKey interface. | |
| <h4 id="Certificate.Verify">func (*Certificate) Verify</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Certificate"><span class="nx">Certificate</span></a><span class="p">)</span> <span class="nf">Verify</span><span class="p">(</span><span class="nx">data</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">sig</span> <span class="o">*</span><a href="#Signature"><span class="nx">Signature</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Verify verifies a signature against the certificate's public | |
| key. It is part of the PublicKey interface. | |
| <h3 id="Channel">type Channel</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Channel</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>A Channel is an ordered, reliable, flow-controlled, duplex stream | |
| that is multiplexed over an SSH connection. | |
| <h4 id="Channel.Close">func (*Channel) Close</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">Close</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Close signals end of channel use. No data may be sent after this call. | |
| <h4 id="Channel.CloseWrite">func (*Channel) CloseWrite</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">CloseWrite</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>CloseWrite signals the end of sending in-band data. Requests may still be | |
| sent, and the other side may still send data. | |
| <h4 id="Channel.Handle">func (*Channel) Handle</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">Handle</span><span class="p">(</span><span class="nx">handler</span> <a href="#RequestHandler"><span class="nx">RequestHandler</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Handle must be called to handle channel's requests. Handle blocks. If | |
| requestHandler is nil, requests will be discarded. | |
| <h4 id="Channel.Read">func (*Channel) Read</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">Read</span><span class="p">(</span><span class="nx">data</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Read reads up to len(data) bytes from the channel. | |
| <h4 id="Channel.SendRequest">func (*Channel) SendRequest</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">SendRequest</span><span class="p">(</span><span class="nx">name</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">wantReply</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">,</span> <span class="nx">payload</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>SendRequest sends a channel request. If wantReply is true, it will wait for a | |
| reply and return the result as a boolean, otherwise the return value will be | |
| false. Channel requests are out-of-band messages so they may be sent even if | |
| the data stream is closed or blocked by flow control. If the channel is | |
| closed before a reply is returned, io.EOF is returned. | |
| <h4 id="Channel.SetDeadline">func (*Channel) SetDeadline</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">SetDeadline</span><span class="p">(</span><span class="nx">deadline</span> <a href="https://pkg.go.dev/time"><span class="nx">time</span></a><span class="p">.</span><a href="https://pkg.go.dev/time#Time"><span class="nx">Time</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>SetDeadline sets the read and write deadlines associated with the | |
| channel. It is equivalent to calling both SetReadDeadline and | |
| SetWriteDeadline. Deadlines errors are not fatal, the Channel can be used | |
| again after resetting the deadlines. | |
| <h4 id="Channel.SetReadDeadline">func (*Channel) SetReadDeadline</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">SetReadDeadline</span><span class="p">(</span><span class="nx">deadline</span> <a href="https://pkg.go.dev/time"><span class="nx">time</span></a><span class="p">.</span><a href="https://pkg.go.dev/time#Time"><span class="nx">Time</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>SetReadDeadline sets the deadline for future Read calls and unblock Read | |
| calls waiting for data. A zero value for t means Read will not time out. | |
| <h4 id="Channel.SetWriteDeadline">func (*Channel) SetWriteDeadline</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">SetWriteDeadline</span><span class="p">(</span><span class="nx">deadline</span> <a href="https://pkg.go.dev/time"><span class="nx">time</span></a><span class="p">.</span><a href="https://pkg.go.dev/time#Time"><span class="nx">Time</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>SetWriteDeadline sets the deadline for future Write calls and unblock | |
| Write calls waiting for window capacity. A zero value for t means Write | |
| will not time out. | |
| <h4 id="Channel.Stderr">func (*Channel) Stderr</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">Stderr</span><span class="p">()</span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#ReadWriter"><span class="nx">ReadWriter</span></a></pre> | |
| <p>Stderr returns an io.ReadWriter that writes to this channel with the extended | |
| data type set to stderr. Stderr may safely be read and written from a | |
| different goroutine than Read and Write respectively. | |
| <h4 id="Channel.Write">func (*Channel) Write</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">)</span> <span class="nf">Write</span><span class="p">(</span><span class="nx">data</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Write writes len(data) bytes to the channel. | |
| <h3 id="ChannelHandler">type ChannelHandler</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ChannelHandler</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span id="ChannelHandler.NewChannel"><span class="nf">NewChannel</span></span><span class="p">(</span><span class="nx">ch</span> <span class="o">*</span><a href="#NewChannel"><span class="nx">NewChannel</span></a><span class="p">)</span> | |
| <span class="p">}</span></pre> | |
| <p>ChannelHandler defines the interface to handle new channel requests. | |
| <h3 id="ChannelHandlerFunc">type ChannelHandlerFunc</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ChannelHandlerFunc</span> <span class="kd">func</span><span class="p">(</span><span class="nx">ch</span> <span class="o">*</span><a href="#NewChannel"><span class="nx">NewChannel</span></a><span class="p">)</span></pre> | |
| <p>ChannelHandlerFunc is an adapter to allow the use of ordinary function as | |
| <a href="#ChannelHandler">ChannelHandler</a>. If f is a function with the appropriate signature, | |
| ChannelHandlerFunc(f) is a <a href="#ChannelHandler">ChannelHandler</a> that calls f. | |
| <h4 id="ChannelHandlerFunc.NewChannel">func (ChannelHandlerFunc) NewChannel</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">f</span> <a href="#ChannelHandlerFunc"><span class="nx">ChannelHandlerFunc</span></a><span class="p">)</span> <span class="nf">NewChannel</span><span class="p">(</span><span class="nx">ch</span> <span class="o">*</span><a href="#NewChannel"><span class="nx">NewChannel</span></a><span class="p">)</span></pre> | |
| <p>NewChannel calls f(ch). | |
| <h3 id="Client">type Client</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Client</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>Client implements a traditional SSH client that supports shells, | |
| subprocesses, TCP port/streamlocal forwarding and tunneled dialing. | |
| <h4 id="Dial">func Dial</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">Dial</span><span class="p">(</span><span class="nx">ctx</span> <a href="https://pkg.go.dev/context"><span class="nx">context</span></a><span class="p">.</span><a href="https://pkg.go.dev/context#Context"><span class="nx">Context</span></a><span class="p">,</span> <span class="nx">network</span><span class="p">,</span> <span class="nx">addr</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">config</span> <span class="o">*</span><a href="#ClientConfig"><span class="nx">ClientConfig</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Client"><span class="nx">Client</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Dial starts a client connection to the given SSH server. It is a | |
| convenience function that connects to the given network address, | |
| initiates the SSH handshake, and then sets up a Client. For access | |
| to incoming channels and requests, use net.Dial with NewClientConn | |
| instead. | |
| <details id="example-Dial" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"bytes"</span> | |
| <span class="s">"context"</span> | |
| <span class="s">"fmt"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"time"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="kd">var</span> <span class="nx">hostKey</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">PublicKey</span> | |
| <span class="c1">// An SSH client is represented with a ClientConn. | |
| </span><span class="c1"></span> <span class="c1">// | |
| </span><span class="c1"></span> <span class="c1">// To authenticate with the remote server you must pass at least one | |
| </span><span class="c1"></span> <span class="c1">// implementation of AuthMethod via the Auth field in ClientConfig, | |
| </span><span class="c1"></span> <span class="c1">// and provide a HostKeyCallback. | |
| </span><span class="c1"></span> <span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">ClientConfig</span><span class="p">{</span> | |
| <span class="nx">User</span><span class="p">:</span> <span class="s">"username"</span><span class="p">,</span> | |
| <span class="nx">Auth</span><span class="p">:</span> <span class="p">[]</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">AuthMethod</span><span class="p">{</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nf">Password</span><span class="p">(</span><span class="s">"yourpassword"</span><span class="p">),</span> | |
| <span class="p">},</span> | |
| <span class="nx">HostKey</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">FixedHostKey</span><span class="p">(</span><span class="nx">hostKey</span><span class="p">),</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Allow at most 10 seconds to complete the handshake and create the Client. | |
| </span><span class="c1"></span> <span class="nx">ctx</span><span class="p">,</span> <span class="nx">cancel</span> <span class="o">:=</span> <span class="nx">context</span><span class="p">.</span><span class="nf">WithTimeout</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">(),</span> <span class="mi">10</span><span class="o">*</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span> | |
| <span class="k">defer</span> <span class="nf">cancel</span><span class="p">()</span> | |
| <span class="nx">client</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">Dial</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">"tcp"</span><span class="p">,</span> <span class="s">"yourserver.com:22"</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to dial: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="k">defer</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="c1">// Each ClientConn can support multiple interactive sessions, | |
| </span><span class="c1"></span> <span class="c1">// represented by a Session. | |
| </span><span class="c1"></span> <span class="nx">session</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">NewSession</span><span class="p">()</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to create session: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="k">defer</span> <span class="nx">session</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="c1">// Once a Session is created, you can execute a single command on | |
| </span><span class="c1"></span> <span class="c1">// the remote side using the Run method. | |
| </span><span class="c1"></span> <span class="kd">var</span> <span class="nx">b</span> <span class="nx">bytes</span><span class="p">.</span><span class="nx">Buffer</span> | |
| <span class="nx">session</span><span class="p">.</span><span class="nx">Stdout</span> <span class="p">=</span> <span class="o">&</span><span class="nx">b</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">session</span><span class="p">.</span><span class="nf">Run</span><span class="p">(</span><span class="s">"/usr/bin/whoami"</span><span class="p">);</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to run: "</span> <span class="o">+</span> <span class="nx">err</span><span class="p">.</span><span class="nf">Error</span><span class="p">())</span> | |
| <span class="p">}</span> | |
| <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">b</span><span class="p">.</span><span class="nf">String</span><span class="p">())</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="NewClient">func NewClient</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">NewClient</span><span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#ClientConn"><span class="nx">ClientConn</span></a><span class="p">)</span> <span class="o">*</span><a href="#Client"><span class="nx">Client</span></a></pre> | |
| <p>NewClient creates a Client on top of the given connection. | |
| <h4 id="Client.Close">func (Client) Close</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">Client</span><span class="p">)</span> <span class="nf">Close</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <h4 id="Client.Dial">func (*Client) Dial</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Client"><span class="nx">Client</span></a><span class="p">)</span> <span class="nf">Dial</span><span class="p">(</span><span class="nx">ctx</span> <a href="https://pkg.go.dev/context"><span class="nx">context</span></a><span class="p">.</span><a href="https://pkg.go.dev/context#Context"><span class="nx">Context</span></a><span class="p">,</span> <span class="nx">n</span><span class="p">,</span> <span class="nx">addr</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Conn"><span class="nx">Conn</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Dial initiates a connection to the addr from the remote host. | |
| The resulting connection has a zero LocalAddr() and RemoteAddr(). | |
| <h4 id="Client.DialTCP">func (*Client) DialTCP</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Client"><span class="nx">Client</span></a><span class="p">)</span> <span class="nf">DialTCP</span><span class="p">(</span><span class="nx">ctx</span> <a href="https://pkg.go.dev/context"><span class="nx">context</span></a><span class="p">.</span><a href="https://pkg.go.dev/context#Context"><span class="nx">Context</span></a><span class="p">,</span> <span class="nx">n</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">laddr</span><span class="p">,</span> <span class="nx">raddr</span> <span class="o">*</span><a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#TCPAddr"><span class="nx">TCPAddr</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Conn"><span class="nx">Conn</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>DialTCP connects to the remote address raddr on the network net, | |
| which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used | |
| as the local address for the connection. | |
| <h4 id="Client.HandleChannelOpen">func (*Client) HandleChannelOpen</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Client"><span class="nx">Client</span></a><span class="p">)</span> <span class="nf">HandleChannelOpen</span><span class="p">(</span><span class="nx">channelType</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">handler</span> <a href="#ChannelHandler"><span class="nx">ChannelHandler</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>HandleChannelOpen allows to define a <a href="#ChannelHandler">ChannelHandler</a> for the specified | |
| channel type. An error is returned if an handler for the specified type is | |
| already registered. | |
| <h4 id="Client.Listen">func (*Client) Listen</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Client"><span class="nx">Client</span></a><span class="p">)</span> <span class="nf">Listen</span><span class="p">(</span><span class="nx">n</span><span class="p">,</span> <span class="nx">addr</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Listener"><span class="nx">Listener</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Listen requests the remote peer open a listening socket on | |
| addr. Incoming connections will be available by calling Accept on | |
| the returned net.Listener. The listener must be serviced, or the | |
| SSH connection may hang. | |
| N must be "tcp", "tcp4", "tcp6", or "unix". | |
| <details id="example-Client.Listen" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"context"</span> | |
| <span class="s">"fmt"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"net/http"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="kd">var</span> <span class="nx">hostKey</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">PublicKey</span> | |
| <span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">ClientConfig</span><span class="p">{</span> | |
| <span class="nx">User</span><span class="p">:</span> <span class="s">"username"</span><span class="p">,</span> | |
| <span class="nx">Auth</span><span class="p">:</span> <span class="p">[]</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">AuthMethod</span><span class="p">{</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nf">Password</span><span class="p">(</span><span class="s">"password"</span><span class="p">),</span> | |
| <span class="p">},</span> | |
| <span class="nx">HostKey</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">FixedHostKey</span><span class="p">(</span><span class="nx">hostKey</span><span class="p">),</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Dial your ssh server. | |
| </span><span class="c1"></span> <span class="nx">conn</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">Dial</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">(),</span> <span class="s">"tcp"</span><span class="p">,</span> <span class="s">"localhost:22"</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to connect: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="k">defer</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="c1">// Request the remote side to open port 8080 on all interfaces. | |
| </span><span class="c1"></span> <span class="nx">l</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">Listen</span><span class="p">(</span><span class="s">"tcp"</span><span class="p">,</span> <span class="s">"0.0.0.0:8080"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to register tcp forward: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="k">defer</span> <span class="nx">l</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="c1">// Serve HTTP with your SSH server acting as a reverse proxy. | |
| </span><span class="c1"></span> <span class="nx">http</span><span class="p">.</span><span class="nf">Serve</span><span class="p">(</span><span class="nx">l</span><span class="p">,</span> <span class="nx">http</span><span class="p">.</span><span class="nf">HandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">resp</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="nx">fmt</span><span class="p">.</span><span class="nf">Fprintf</span><span class="p">(</span><span class="nx">resp</span><span class="p">,</span> <span class="s">"Hello world!\n"</span><span class="p">)</span> | |
| <span class="p">}))</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="Client.ListenUnix">func (*Client) ListenUnix</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Client"><span class="nx">Client</span></a><span class="p">)</span> <span class="nf">ListenUnix</span><span class="p">(</span><span class="nx">socketPath</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Listener"><span class="nx">Listener</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>ListenUnix is similar to ListenTCP but uses a Unix domain socket. | |
| <h4 id="Client.NewSession">func (*Client) NewSession</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Client"><span class="nx">Client</span></a><span class="p">)</span> <span class="nf">NewSession</span><span class="p">()</span> <span class="p">(</span><span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>NewSession opens a new Session for this client. (A session is a remote | |
| execution of a program.) | |
| <h3 id="ClientConfig">type ClientConfig</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ClientConfig</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// Config contains configuration that is shared between clients and | |
| </span><span class="c1"></span> <span class="c1">// servers. | |
| </span><span class="c1"></span> <a href="#Config"><span class="nx">Config</span></a> | |
| <span class="c1">// User contains the username to authenticate as. | |
| </span><span class="c1"></span> <span id="ClientConfig.User"><span class="nx">User</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// Auth contains possible authentication methods to use with the | |
| </span><span class="c1"></span> <span class="c1">// server. Only the first instance of a particular RFC 4252 method will | |
| </span><span class="c1"></span> <span class="c1">// be used during authentication. | |
| </span><span class="c1"></span> <span id="ClientConfig.Auth"><span class="nx">Auth</span></span> <span class="p">[]</span><a href="#AuthMethod"><span class="nx">AuthMethod</span></a> | |
| <span class="c1">// HostKey is called during the cryptographic | |
| </span><span class="c1"></span> <span class="c1">// handshake to validate the server's host key. The client | |
| </span><span class="c1"></span> <span class="c1">// configuration must supply this callback for the connection | |
| </span><span class="c1"></span> <span class="c1">// to succeed. The functions InsecureIgnoreHostKey or | |
| </span><span class="c1"></span> <span class="c1">// FixedHostKey can be used for simplistic host key checks. | |
| </span><span class="c1"></span> <span id="ClientConfig.HostKey"><span class="nx">HostKey</span></span> <a href="#HostKeyCallback"><span class="nx">HostKeyCallback</span></a> | |
| <span class="c1">// Banner is called during the SSH dance to display a custom | |
| </span><span class="c1"></span> <span class="c1">// server's message. The client configuration can supply this callback to | |
| </span><span class="c1"></span> <span class="c1">// handle it as wished. The function BannerDisplayStderr can be used for | |
| </span><span class="c1"></span> <span class="c1">// simplistic display on Stderr. | |
| </span><span class="c1"></span> <span id="ClientConfig.Banner"><span class="nx">Banner</span></span> <a href="#BannerCallback"><span class="nx">BannerCallback</span></a> | |
| <span class="c1">// ClientVersion contains the version identification string that will | |
| </span><span class="c1"></span> <span class="c1">// be used for the connection. If empty, a reasonable default is used. | |
| </span><span class="c1"></span> <span id="ClientConfig.ClientVersion"><span class="nx">ClientVersion</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// HostKeyAlgorithms lists the public key algorithms that the client will | |
| </span><span class="c1"></span> <span class="c1">// accept from the server for host key authentication, in order of | |
| </span><span class="c1"></span> <span class="c1">// preference. If empty, a reasonable default is used. Any | |
| </span><span class="c1"></span> <span class="c1">// string returned from a PublicKey.Type method may be used, or | |
| </span><span class="c1"></span> <span class="c1">// any of the CertAlgo and KeyAlgo constants. | |
| </span><span class="c1"></span> <span id="ClientConfig.HostKeyAlgorithms"><span class="nx">HostKeyAlgorithms</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="p">}</span></pre> | |
| <p>A ClientConfig structure is used to configure a Client. It must not be | |
| modified after having been passed to an SSH function. | |
| <h3 id="ClientConn">type ClientConn</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ClientConn</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>ClientConn is an authenticated SSH connection, as seen from the | |
| client | |
| <h4 id="NewClientConn">func NewClientConn</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">NewClientConn</span><span class="p">(</span><span class="nx">c</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Conn"><span class="nx">Conn</span></a><span class="p">,</span> <span class="nx">addr</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">config</span> <span class="o">*</span><a href="#ClientConfig"><span class="nx">ClientConfig</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#ClientConn"><span class="nx">ClientConn</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>NewClientConn establishes an authenticated SSH connection using c as the | |
| underlying transport. You can use <a href="#NewClient">NewClient</a> to build an SSH client or | |
| handle this client connection yourself by using <a href="#ClientConn.Handle">ClientConn.Handle</a>. | |
| <h4 id="ClientConn.Close">func (ClientConn) Close</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">ClientConn</span><span class="p">)</span> <span class="nf">Close</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <h4 id="ClientConn.Handle">func (*ClientConn) Handle</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#ClientConn"><span class="nx">ClientConn</span></a><span class="p">)</span> <span class="nf">Handle</span><span class="p">(</span><span class="nx">channelHandler</span> <a href="#ChannelHandler"><span class="nx">ChannelHandler</span></a><span class="p">,</span> <span class="nx">requestHandler</span> <a href="#RequestHandler"><span class="nx">RequestHandler</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Handle must be called to handle requests and channels if you want to handle a | |
| <a href="#ClientConn">ClientConn</a> yourself without building a <a href="#Client">Client</a> using <a href="#NewClient">NewClient</a>. Handle | |
| blocks. If channelHandler is nil channels will be rejected. If requestHandler | |
| is nil, requests will be discarded. | |
| <h3 id="ClientHandler">type ClientHandler</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ClientHandler</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span class="c1">// HandleClient is called after the handshake completes and a client | |
| </span><span class="c1"></span> <span class="c1">// authenticates with the server. | |
| </span><span class="c1"></span> <span id="ClientHandler.HandleClient"><span class="nf">HandleClient</span></span><span class="p">(</span><span class="nx">conn</span> <span class="o">*</span><a href="#ServerConn"><span class="nx">ServerConn</span></a><span class="p">)</span> | |
| <span class="p">}</span></pre> | |
| <p>ClientHandler defines the interface to handle authenticated server | |
| connections. | |
| <h3 id="ClientHandlerFunc">type ClientHandlerFunc</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ClientHandlerFunc</span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <span class="o">*</span><a href="#ServerConn"><span class="nx">ServerConn</span></a><span class="p">)</span></pre> | |
| <p>ClientHandlerFunc is an adapter to allow the use of ordinary function as | |
| <a href="#ClientHandler">ClientHandler</a>. If f is a function with the appropriate signature, | |
| ClientHandlerFunc(f) is a <a href="#ClientHandler">ClientHandler</a> that calls f. | |
| <h4 id="ClientHandlerFunc.HandleClient">func (ClientHandlerFunc) HandleClient</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">f</span> <a href="#ClientHandlerFunc"><span class="nx">ClientHandlerFunc</span></a><span class="p">)</span> <span class="nf">HandleClient</span><span class="p">(</span><span class="nx">conn</span> <span class="o">*</span><a href="#ServerConn"><span class="nx">ServerConn</span></a><span class="p">)</span></pre> | |
| <p>HandleClient calls f(conn). | |
| <h3 id="Config">type Config</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Config</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// Rand provides the source of entropy for cryptographic | |
| </span><span class="c1"></span> <span class="c1">// primitives. If Rand is nil, the cryptographic random reader | |
| </span><span class="c1"></span> <span class="c1">// in package crypto/rand will be used. | |
| </span><span class="c1"></span> <span id="Config.Rand"><span class="nx">Rand</span></span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Reader"><span class="nx">Reader</span></a> | |
| <span class="c1">// The maximum number of bytes sent or received after which a | |
| </span><span class="c1"></span> <span class="c1">// new key is negotiated. It must be at least 256. If | |
| </span><span class="c1"></span> <span class="c1">// unspecified, a size suitable for the chosen cipher is used. | |
| </span><span class="c1"></span> <span id="Config.RekeyThreshold"><span class="nx">RekeyThreshold</span></span> <a href="https://pkg.go.dev/builtin#uint64"><span class="kt">uint64</span></a> | |
| <span class="c1">// The allowed key exchanges algorithms. If unspecified then a default set | |
| </span><span class="c1"></span> <span class="c1">// of algorithms is used. Unsupported values are silently ignored. | |
| </span><span class="c1"></span> <span id="Config.KeyExchanges"><span class="nx">KeyExchanges</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// The allowed cipher algorithms. If unspecified then a sensible default is | |
| </span><span class="c1"></span> <span class="c1">// used. Unsupported values are silently ignored. | |
| </span><span class="c1"></span> <span id="Config.Ciphers"><span class="nx">Ciphers</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// The allowed MAC algorithms. If unspecified then a sensible default is | |
| </span><span class="c1"></span> <span class="c1">// used. Unsupported values are silently ignored. | |
| </span><span class="c1"></span> <span id="Config.MACs"><span class="nx">MACs</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="p">}</span></pre> | |
| <p>Config contains configuration data common to both Server and | |
| ClientConfig. | |
| <h4 id="Config.SetDefaults">func (*Config) SetDefaults</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#Config"><span class="nx">Config</span></a><span class="p">)</span> <span class="nf">SetDefaults</span><span class="p">()</span></pre> | |
| <p>SetDefaults sets sensible values for unset fields in config. This is | |
| exported for testing: Configs passed to SSH functions are copied and have | |
| default values set automatically. | |
| <h3 id="ConnMetadata">type ConnMetadata</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ConnMetadata</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>ConnMetadata holds metadata for the connection. | |
| <h4 id="ConnMetadata.ClientVersion">func (ConnMetadata) ClientVersion</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">ConnMetadata</span><span class="p">)</span> <span class="nf">ClientVersion</span><span class="p">()</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a></pre> | |
| <p>ClientVersion returns the client's version string as hashed into the session | |
| ID. | |
| <h4 id="ConnMetadata.LocalAddr">func (ConnMetadata) LocalAddr</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">ConnMetadata</span><span class="p">)</span> <span class="nf">LocalAddr</span><span class="p">()</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Addr"><span class="nx">Addr</span></a></pre> | |
| <p>LocalAddr returns the local address for this connection. | |
| <h4 id="ConnMetadata.RemoteAddr">func (ConnMetadata) RemoteAddr</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">ConnMetadata</span><span class="p">)</span> <span class="nf">RemoteAddr</span><span class="p">()</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Addr"><span class="nx">Addr</span></a></pre> | |
| <p>RemoteAddr returns the remote address for this connection. | |
| <h4 id="ConnMetadata.ServerVersion">func (ConnMetadata) ServerVersion</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">ConnMetadata</span><span class="p">)</span> <span class="nf">ServerVersion</span><span class="p">()</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a></pre> | |
| <p>ServerVersion returns the server's version string as hashed into the session | |
| ID. | |
| <h4 id="ConnMetadata.SessionID">func (ConnMetadata) SessionID</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">ConnMetadata</span><span class="p">)</span> <span class="nf">SessionID</span><span class="p">()</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a></pre> | |
| <p>SessionID returns the session hash, also denoted by H. | |
| <h4 id="ConnMetadata.User">func (ConnMetadata) User</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">ConnMetadata</span><span class="p">)</span> <span class="nf">User</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>User returns the user ID for this connection. | |
| <h3 id="CryptoPublicKey">type CryptoPublicKey</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">CryptoPublicKey</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span id="CryptoPublicKey.CryptoPublicKey"><span class="nf">CryptoPublicKey</span></span><span class="p">()</span> <a href="https://pkg.go.dev/crypto"><span class="nx">crypto</span></a><span class="p">.</span><a href="https://pkg.go.dev/crypto#PublicKey"><span class="nx">PublicKey</span></a> | |
| <span class="p">}</span></pre> | |
| <p>CryptoPublicKey, if implemented by a PublicKey, | |
| returns the underlying crypto.PublicKey form of the key. | |
| <h3 id="ExitError">type ExitError</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ExitError</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <a href="#Waitmsg"><span class="nx">Waitmsg</span></a> | |
| <span class="p">}</span></pre> | |
| <p>An ExitError reports unsuccessful completion of a remote command. | |
| <h4 id="ExitError.Error">func (*ExitError) Error</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">e</span> <span class="o">*</span><a href="#ExitError"><span class="nx">ExitError</span></a><span class="p">)</span> <span class="nf">Error</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h3 id="ExitMissingError">type ExitMissingError</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ExitMissingError</span> <span class="kd">struct</span><span class="p">{}</span></pre> | |
| <p>ExitMissingError is returned if a session is torn down cleanly, but | |
| the server sends no confirmation of the exit status. | |
| <h4 id="ExitMissingError.Error">func (*ExitMissingError) Error</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">e</span> <span class="o">*</span><a href="#ExitMissingError"><span class="nx">ExitMissingError</span></a><span class="p">)</span> <span class="nf">Error</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h3 id="GSSAPIClient">type GSSAPIClient</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">GSSAPIClient</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span class="c1">// InitSecContext initiates the establishment of a security context for GSS-API between the | |
| </span><span class="c1"></span> <span class="c1">// ssh client and ssh server. Initially the token parameter should be specified as nil. | |
| </span><span class="c1"></span> <span class="c1">// The routine may return a outputToken which should be transferred to | |
| </span><span class="c1"></span> <span class="c1">// the ssh server, where the ssh server will present it to | |
| </span><span class="c1"></span> <span class="c1">// AcceptSecContext. If no token need be sent, InitSecContext will indicate this by setting | |
| </span><span class="c1"></span> <span class="c1">// needContinue to false. To complete the context | |
| </span><span class="c1"></span> <span class="c1">// establishment, one or more reply tokens may be required from the ssh | |
| </span><span class="c1"></span> <span class="c1">// server;if so, InitSecContext will return a needContinue which is true. | |
| </span><span class="c1"></span> <span class="c1">// In this case, InitSecContext should be called again when the | |
| </span><span class="c1"></span> <span class="c1">// reply token is received from the ssh server, passing the reply | |
| </span><span class="c1"></span> <span class="c1">// token to InitSecContext via the token parameters. | |
| </span><span class="c1"></span> <span class="c1">// See RFC 2743 section 2.2.1 and RFC 4462 section 3.4. | |
| </span><span class="c1"></span> <span id="GSSAPIClient.InitSecContext"><span class="nf">InitSecContext</span></span><span class="p">(</span><span class="nx">target</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">token</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">isGSSDelegCreds</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">)</span> <span class="p">(</span><span class="nx">outputToken</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">needContinue</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// GetMIC generates a cryptographic MIC for the SSH2 message, and places | |
| </span><span class="c1"></span> <span class="c1">// the MIC in a token for transfer to the ssh server. | |
| </span><span class="c1"></span> <span class="c1">// The contents of the MIC field are obtained by calling GSS_GetMIC() | |
| </span><span class="c1"></span> <span class="c1">// over the following, using the GSS-API context that was just | |
| </span><span class="c1"></span> <span class="c1">// established: | |
| </span><span class="c1"></span> <span class="c1">// string session identifier | |
| </span><span class="c1"></span> <span class="c1">// byte SSH_MSG_USERAUTH_REQUEST | |
| </span><span class="c1"></span> <span class="c1">// string user name | |
| </span><span class="c1"></span> <span class="c1">// string service | |
| </span><span class="c1"></span> <span class="c1">// string "gssapi-with-mic" | |
| </span><span class="c1"></span> <span class="c1">// See RFC 2743 section 2.3.1 and RFC 4462 3.5. | |
| </span><span class="c1"></span> <span id="GSSAPIClient.GetMIC"><span class="nf">GetMIC</span></span><span class="p">(</span><span class="nx">micFiled</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">([]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// Whenever possible, it should be possible for | |
| </span><span class="c1"></span> <span class="c1">// DeleteSecContext() calls to be successfully processed even | |
| </span><span class="c1"></span> <span class="c1">// if other calls cannot succeed, thereby enabling context-related | |
| </span><span class="c1"></span> <span class="c1">// resources to be released. | |
| </span><span class="c1"></span> <span class="c1">// In addition to deleting established security contexts, | |
| </span><span class="c1"></span> <span class="c1">// gss_delete_sec_context must also be able to delete "half-built" | |
| </span><span class="c1"></span> <span class="c1">// security contexts resulting from an incomplete sequence of | |
| </span><span class="c1"></span> <span class="c1">// InitSecContext()/AcceptSecContext() calls. | |
| </span><span class="c1"></span> <span class="c1">// See RFC 2743 section 2.2.3. | |
| </span><span class="c1"></span> <span id="GSSAPIClient.DeleteSecContext"><span class="nf">DeleteSecContext</span></span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a> | |
| <span class="p">}</span></pre> | |
| <p>GSSAPIClient provides the API to plug-in GSSAPI authentication for client logins. | |
| <h3 id="GSSAPIServer">type GSSAPIServer</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">GSSAPIServer</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span class="c1">// AcceptSecContext allows a remotely initiated security context between the application | |
| </span><span class="c1"></span> <span class="c1">// and a remote peer to be established by the ssh client. The routine may return a | |
| </span><span class="c1"></span> <span class="c1">// outputToken which should be transferred to the ssh client, | |
| </span><span class="c1"></span> <span class="c1">// where the ssh client will present it to InitSecContext. | |
| </span><span class="c1"></span> <span class="c1">// If no token need be sent, AcceptSecContext will indicate this | |
| </span><span class="c1"></span> <span class="c1">// by setting the needContinue to false. To | |
| </span><span class="c1"></span> <span class="c1">// complete the context establishment, one or more reply tokens may be | |
| </span><span class="c1"></span> <span class="c1">// required from the ssh client. if so, AcceptSecContext | |
| </span><span class="c1"></span> <span class="c1">// will return a needContinue which is true, in which case it | |
| </span><span class="c1"></span> <span class="c1">// should be called again when the reply token is received from the ssh | |
| </span><span class="c1"></span> <span class="c1">// client, passing the token to AcceptSecContext via the | |
| </span><span class="c1"></span> <span class="c1">// token parameters. | |
| </span><span class="c1"></span> <span class="c1">// The srcName return value is the authenticated username. | |
| </span><span class="c1"></span> <span class="c1">// See RFC 2743 section 2.2.2 and RFC 4462 section 3.4. | |
| </span><span class="c1"></span> <span id="GSSAPIServer.AcceptSecContext"><span class="nf">AcceptSecContext</span></span><span class="p">(</span><span class="nx">token</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="nx">outputToken</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">srcName</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">needContinue</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// VerifyMIC verifies that a cryptographic MIC, contained in the token parameter, | |
| </span><span class="c1"></span> <span class="c1">// fits the supplied message is received from the ssh client. | |
| </span><span class="c1"></span> <span class="c1">// See RFC 2743 section 2.3.2. | |
| </span><span class="c1"></span> <span id="GSSAPIServer.VerifyMIC"><span class="nf">VerifyMIC</span></span><span class="p">(</span><span class="nx">micField</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">micToken</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a> | |
| <span class="c1">// Whenever possible, it should be possible for | |
| </span><span class="c1"></span> <span class="c1">// DeleteSecContext() calls to be successfully processed even | |
| </span><span class="c1"></span> <span class="c1">// if other calls cannot succeed, thereby enabling context-related | |
| </span><span class="c1"></span> <span class="c1">// resources to be released. | |
| </span><span class="c1"></span> <span class="c1">// In addition to deleting established security contexts, | |
| </span><span class="c1"></span> <span class="c1">// gss_delete_sec_context must also be able to delete "half-built" | |
| </span><span class="c1"></span> <span class="c1">// security contexts resulting from an incomplete sequence of | |
| </span><span class="c1"></span> <span class="c1">// InitSecContext()/AcceptSecContext() calls. | |
| </span><span class="c1"></span> <span class="c1">// See RFC 2743 section 2.2.3. | |
| </span><span class="c1"></span> <span id="GSSAPIServer.DeleteSecContext"><span class="nf">DeleteSecContext</span></span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a> | |
| <span class="p">}</span></pre> | |
| <p>GSSAPIServer provides the API to plug in GSSAPI authentication for server logins. | |
| <h3 id="GSSAPIWithMICConfig">type GSSAPIWithMICConfig</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">GSSAPIWithMICConfig</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// AllowLogin, must be set, is called when gssapi-with-mic | |
| </span><span class="c1"></span> <span class="c1">// authentication is selected (RFC 4462 section 3). The srcName is from the | |
| </span><span class="c1"></span> <span class="c1">// results of the GSS-API authentication. The format is username@DOMAIN. | |
| </span><span class="c1"></span> <span class="c1">// GSSAPI just guarantees to the server who the user is, but not if they can log in, and with what permissions. | |
| </span><span class="c1"></span> <span class="c1">// This callback is called after the user identity is established with GSSAPI to decide if the user can login with | |
| </span><span class="c1"></span> <span class="c1">// which permissions. If the user is allowed to login, it should return a nil error. | |
| </span><span class="c1"></span> <span id="GSSAPIWithMICConfig.AllowLogin"><span class="nx">AllowLogin</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">srcName</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// Server must be set. It's the implementation | |
| </span><span class="c1"></span> <span class="c1">// of the GSSAPIServer interface. See GSSAPIServer interface for details. | |
| </span><span class="c1"></span> <span id="GSSAPIWithMICConfig.Server"><span class="nx">Server</span></span> <a href="#GSSAPIServer"><span class="nx">GSSAPIServer</span></a> | |
| <span class="p">}</span></pre> | |
| <h3 id="HostKeyCallback">type HostKeyCallback</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">HostKeyCallback</span> <span class="kd">func</span><span class="p">(</span><span class="nx">hostname</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">remote</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Addr"><span class="nx">Addr</span></a><span class="p">,</span> <span class="nx">key</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>HostKeyCallback is the function type used for verifying server | |
| keys. A HostKeyCallback must return nil if the host key is OK, or | |
| an error to reject it. It receives the hostname as passed to Dial | |
| or NewClientConn. The remote address is the RemoteAddr of the | |
| net.Conn underlying the SSH connection. | |
| <h4 id="FixedHostKey">func FixedHostKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">FixedHostKey</span><span class="p">(</span><span class="nx">key</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <a href="#HostKeyCallback"><span class="nx">HostKeyCallback</span></a></pre> | |
| <p>FixedHostKey returns a function for use in | |
| ClientConfig.HostKeyCallback to accept only a specific host key. | |
| <h4 id="InsecureIgnoreHostKey">func InsecureIgnoreHostKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">InsecureIgnoreHostKey</span><span class="p">()</span> <a href="#HostKeyCallback"><span class="nx">HostKeyCallback</span></a></pre> | |
| <p>InsecureIgnoreHostKey returns a function that can be used for | |
| ClientConfig.HostKeyCallback to accept any host key. It should | |
| not be used for production code. | |
| <h3 id="KeyboardInteractiveChallenge">type KeyboardInteractiveChallenge</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">KeyboardInteractiveChallenge</span> <span class="kd">func</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">instruction</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">questions</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">echos</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">)</span> <span class="p">(</span><span class="nx">answers</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>KeyboardInteractiveChallenge should print questions, optionally | |
| disabling echoing (e.g. for passwords), and return all the answers. | |
| Challenge may be called multiple times in a single session. After | |
| successful authentication, the server may send a challenge with no | |
| questions, for which the name and instruction messages should be | |
| printed. RFC 4256 section 3.3 details how the UI should behave for | |
| both CLI and GUI environments. | |
| <h3 id="MarshalPrivateKeyOptions">type MarshalPrivateKeyOptions</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">MarshalPrivateKeyOptions</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span id="MarshalPrivateKeyOptions.Comment"><span class="nx">Comment</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="MarshalPrivateKeyOptions.Passphrase"><span class="nx">Passphrase</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="MarshalPrivateKeyOptions.SaltRounds"><span class="nx">SaltRounds</span></span> <a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a> | |
| <span class="p">}</span></pre> | |
| <p>MarshalPrivateKeyOptions defines the available options to Marshal a private | |
| key in OpenSSH format. | |
| <h3 id="NewChannel">type NewChannel</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">NewChannel</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>NewChannel represents an incoming request to a channel. It must either be | |
| accepted for use by calling Accept, or rejected by calling Reject. | |
| <h4 id="NewChannel.Accept">func (*NewChannel) Accept</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#NewChannel"><span class="nx">NewChannel</span></a><span class="p">)</span> <span class="nf">Accept</span><span class="p">()</span> <span class="p">(</span><span class="o">*</span><a href="#Channel"><span class="nx">Channel</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Accept accepts the channel creation request. The returned channel must be | |
| serviced using <a href="#Channel.Handle">Channel.Handle</a>. | |
| <h4 id="NewChannel.ChannelType">func (*NewChannel) ChannelType</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#NewChannel"><span class="nx">NewChannel</span></a><span class="p">)</span> <span class="nf">ChannelType</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>ChannelType returns the type of the channel, as supplied by the | |
| client. | |
| <h4 id="NewChannel.ExtraData">func (*NewChannel) ExtraData</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#NewChannel"><span class="nx">NewChannel</span></a><span class="p">)</span> <span class="nf">ExtraData</span><span class="p">()</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a></pre> | |
| <p>ExtraData returns the arbitrary payload for this channel, as supplied | |
| by the client. This data is specific to the channel type. | |
| <h4 id="NewChannel.Reject">func (*NewChannel) Reject</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#NewChannel"><span class="nx">NewChannel</span></a><span class="p">)</span> <span class="nf">Reject</span><span class="p">(</span><span class="nx">reason</span> <a href="#RejectionReason"><span class="nx">RejectionReason</span></a><span class="p">,</span> <span class="nx">message</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Reject rejects the channel creation request. After calling | |
| this, no other methods on the Channel may be called. | |
| <h3 id="OpenChannelError">type OpenChannelError</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">OpenChannelError</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span id="OpenChannelError.Reason"><span class="nx">Reason</span></span> <a href="#RejectionReason"><span class="nx">RejectionReason</span></a> | |
| <span id="OpenChannelError.Message"><span class="nx">Message</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="p">}</span></pre> | |
| <p>OpenChannelError is returned if the other side rejects an | |
| OpenChannel request. | |
| <h4 id="OpenChannelError.Error">func (*OpenChannelError) Error</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">e</span> <span class="o">*</span><a href="#OpenChannelError"><span class="nx">OpenChannelError</span></a><span class="p">)</span> <span class="nf">Error</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h3 id="PartialSuccessError">type PartialSuccessError</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">PartialSuccessError</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// Next defines the authentication callbacks to apply to further steps. The | |
| </span><span class="c1"></span> <span class="c1">// available methods communicated to the client are based on the non-nil | |
| </span><span class="c1"></span> <span class="c1">// ServerAuthCallbacks fields. | |
| </span><span class="c1"></span> <span id="PartialSuccessError.Next"><span class="nx">Next</span></span> <a href="#ServerAuthCallbacks"><span class="nx">ServerAuthCallbacks</span></a> | |
| <span class="p">}</span></pre> | |
| <p>PartialSuccessError can be returned by any of the <a href="#Server">Server</a> | |
| authentication callbacks to indicate to the client that authentication has | |
| partially succeeded, but further steps are required. | |
| <h4 id="PartialSuccessError.Error">func (*PartialSuccessError) Error</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><a href="#PartialSuccessError"><span class="nx">PartialSuccessError</span></a><span class="p">)</span> <span class="nf">Error</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h3 id="PassphraseMissingError">type PassphraseMissingError</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">PassphraseMissingError</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// PublicKey will be set if the private key format includes an unencrypted | |
| </span><span class="c1"></span> <span class="c1">// public key along with the encrypted private key. | |
| </span><span class="c1"></span> <span id="PassphraseMissingError.PublicKey"><span class="nx">PublicKey</span></span> <a href="#PublicKey"><span class="nx">PublicKey</span></a> | |
| <span class="p">}</span></pre> | |
| <p>A PassphraseMissingError indicates that parsing this private key requires a | |
| passphrase. Use ParsePrivateKeyWithPassphrase. | |
| <h4 id="PassphraseMissingError.Error">func (*PassphraseMissingError) Error</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="o">*</span><a href="#PassphraseMissingError"><span class="nx">PassphraseMissingError</span></a><span class="p">)</span> <span class="nf">Error</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h3 id="Permissions">type Permissions</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Permissions</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// CriticalOptions indicate restrictions to the default | |
| </span><span class="c1"></span> <span class="c1">// permissions, and are typically used in conjunction with | |
| </span><span class="c1"></span> <span class="c1">// user certificates. The standard for SSH certificates | |
| </span><span class="c1"></span> <span class="c1">// defines "force-command" (only allow the given command to | |
| </span><span class="c1"></span> <span class="c1">// execute) and "source-address" (only allow connections from | |
| </span><span class="c1"></span> <span class="c1">// the given address). The SSH package currently only enforces | |
| </span><span class="c1"></span> <span class="c1">// the "source-address" critical option. It is up to server | |
| </span><span class="c1"></span> <span class="c1">// implementations to enforce other critical options, such as | |
| </span><span class="c1"></span> <span class="c1">// "force-command", by checking them after the SSH handshake | |
| </span><span class="c1"></span> <span class="c1">// is successful. In general, SSH servers should reject | |
| </span><span class="c1"></span> <span class="c1">// connections that specify critical options that are unknown | |
| </span><span class="c1"></span> <span class="c1">// or not supported. | |
| </span><span class="c1"></span> <span id="Permissions.CriticalOptions"><span class="nx">CriticalOptions</span></span> <span class="kd">map</span><span class="p">[</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// Extensions are extra functionality that the server may | |
| </span><span class="c1"></span> <span class="c1">// offer on authenticated connections. Lack of support for an | |
| </span><span class="c1"></span> <span class="c1">// extension does not preclude authenticating a user. Common | |
| </span><span class="c1"></span> <span class="c1">// extensions are "permit-agent-forwarding", | |
| </span><span class="c1"></span> <span class="c1">// "permit-X11-forwarding". The Go SSH library currently does | |
| </span><span class="c1"></span> <span class="c1">// not act on any extension, and it is up to server | |
| </span><span class="c1"></span> <span class="c1">// implementations to honor them. Extensions can be used to | |
| </span><span class="c1"></span> <span class="c1">// pass data from the authentication callbacks to the server | |
| </span><span class="c1"></span> <span class="c1">// application layer. | |
| </span><span class="c1"></span> <span id="Permissions.Extensions"><span class="nx">Extensions</span></span> <span class="kd">map</span><span class="p">[</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="p">}</span></pre> | |
| <p>The Permissions type holds fine-grained permissions that are | |
| specific to a user or a specific authentication method for a user. | |
| The Permissions value for a successful authentication attempt is | |
| available in ServerConn, so it can be used to pass information from | |
| the user-authentication phase to the application layer. | |
| <h3 id="PrivateKeySigner">type PrivateKeySigner</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">PrivateKeySigner</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <a href="#Signer"><span class="nx">Signer</span></a> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>PrivateKeySigner is a <a href="#Signer">ssh.Signer</a> that can also return the associated | |
| <a href="https://pkg.go.dev/crypto#Signer">crypto.Signer</a>. | |
| <h4 id="ParsePrivateKey">func ParsePrivateKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">ParsePrivateKey</span><span class="p">(</span><span class="nx">pemBytes</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#PrivateKeySigner"><span class="nx">PrivateKeySigner</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>ParsePrivateKey returns a <a href="#PrivateKeySigner">ssh.PrivateKeySigner</a> from a PEM encoded private | |
| key. It supports RSA, ECDSA, and Ed25519 private keys in PKCS#1, PKCS#8, | |
| OpenSSL, and OpenSSH formats. If the private key is encrypted, it will return | |
| a PassphraseMissingError. | |
| <h4 id="ParsePrivateKeyWithPassphrase">func ParsePrivateKeyWithPassphrase</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">ParsePrivateKeyWithPassphrase</span><span class="p">(</span><span class="nx">pemBytes</span><span class="p">,</span> <span class="nx">passphrase</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#PrivateKeySigner"><span class="nx">PrivateKeySigner</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>ParsePrivateKeyWithPassphrase returns a <a href="#PrivateKeySigner">ssh.PrivateKeySigner</a> from a PEM | |
| encoded private key and passphrase. It supports the same keys as | |
| <a href="#ParsePrivateKey">ssh.ParsePrivateKey</a>. | |
| <h4 id="PrivateKeySigner.CryptoSigner">func (*PrivateKeySigner) CryptoSigner</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">k</span> <span class="o">*</span><a href="#PrivateKeySigner"><span class="nx">PrivateKeySigner</span></a><span class="p">)</span> <span class="nf">CryptoSigner</span><span class="p">()</span> <a href="https://pkg.go.dev/crypto"><span class="nx">crypto</span></a><span class="p">.</span><a href="https://pkg.go.dev/crypto#Signer"><span class="nx">Signer</span></a></pre> | |
| <p>CryptoSigner returns the private key associated with the Signer. It returns a | |
| *rsa.PrivateKey, an *ecdsa.PrivateKey or an ed25519.PrivateKey (not a pointer). | |
| Note: in v1 ed25519.PrivateKey was returned as a pointer. | |
| <h3 id="PublicKey">type PublicKey</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">PublicKey</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span class="c1">// Type returns the key format name, e.g. "ssh-rsa". | |
| </span><span class="c1"></span> <span id="PublicKey.Type"><span class="nf">Type</span></span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// Marshal returns the serialized key data in SSH wire format, with the name | |
| </span><span class="c1"></span> <span class="c1">// prefix. To unmarshal the returned data, use the ParsePublicKey function. | |
| </span><span class="c1"></span> <span id="PublicKey.Marshal"><span class="nf">Marshal</span></span><span class="p">()</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a> | |
| <span class="c1">// Verify that sig is a signature on the given data using this key. This | |
| </span><span class="c1"></span> <span class="c1">// method will hash the data appropriately first. sig.Format is allowed to | |
| </span><span class="c1"></span> <span class="c1">// be any signature algorithm compatible with the key type, the caller | |
| </span><span class="c1"></span> <span class="c1">// should check if it has more stringent requirements. | |
| </span><span class="c1"></span> <span id="PublicKey.Verify"><span class="nf">Verify</span></span><span class="p">(</span><span class="nx">data</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">sig</span> <span class="o">*</span><a href="#Signature"><span class="nx">Signature</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a> | |
| <span class="p">}</span></pre> | |
| <p>PublicKey represents a public key using an unspecified algorithm. | |
| <p>Some PublicKeys provided by this package also implement CryptoPublicKey. | |
| <h4 id="NewPublicKey">func NewPublicKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">NewPublicKey</span><span class="p">(</span><span class="nx">key</span> <a href="https://pkg.go.dev/crypto"><span class="nx">crypto</span></a><span class="p">.</span><a href="https://pkg.go.dev/crypto#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <span class="p">(</span><a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>NewPublicKey takes an *rsa.PublicKey, *ecdsa.PublicKey, or ed25519.PublicKey | |
| returns a corresponding PublicKey instance. ECDSA keys must use P-256, P-384 | |
| or P-521. | |
| <h4 id="ParseAuthorizedKey">func ParseAuthorizedKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">ParseAuthorizedKey</span><span class="p">(</span><span class="nx">in</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="nx">out</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">,</span> <span class="nx">comment</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">options</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">rest</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>ParseAuthorizedKey parses a public key from an authorized_keys | |
| file used in OpenSSH according to the sshd(8) manual page. | |
| <h4 id="ParseKnownHosts">func ParseKnownHosts</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">ParseKnownHosts</span><span class="p">(</span><span class="nx">in</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="nx">marker</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">hosts</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">pubKey</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">,</span> <span class="nx">comment</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">rest</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>ParseKnownHosts parses an entry in the format of the known_hosts file. | |
| <p>The known_hosts format is documented in the sshd(8) manual page. This | |
| function will parse a single entry from in. On successful return, marker | |
| will contain the optional marker value (i.e. "cert-authority" or "revoked") | |
| or else be empty, hosts will contain the hosts that this entry matches, | |
| pubKey will contain the public key and comment will contain any trailing | |
| comment at the end of the line. See the sshd(8) manual page for the various | |
| forms that a host string can take. | |
| <p>The unparsed remainder of the input will be returned in rest. This function | |
| can be called repeatedly to parse multiple entries. | |
| <p>If no entries were found in the input then err will be io.EOF. Otherwise a | |
| non-nil err value indicates a parse error. | |
| <h4 id="ParsePublicKey">func ParsePublicKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">ParsePublicKey</span><span class="p">(</span><span class="nx">in</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="nx">out</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>ParsePublicKey parses an SSH public key formatted for use in | |
| the SSH wire protocol according to RFC 4253, section 6.6. | |
| <h3 id="RejectionReason">type RejectionReason</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">RejectionReason</span> <a href="https://pkg.go.dev/builtin#uint32"><span class="kt">uint32</span></a></pre> | |
| <p>RejectionReason is an enumeration used when rejecting channel creation | |
| requests. See RFC 4254, section 5.1. | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="Prohibited"><span class="nx">Prohibited</span></span> <a href="#RejectionReason"><span class="nx">RejectionReason</span></a> <span class="p">=</span> <a href="https://pkg.go.dev/builtin#iota"><span class="kc">iota</span></a> <span class="o">+</span> <span class="mi">1</span> | |
| <span id="ConnectionFailed"><span class="nx">ConnectionFailed</span></span> | |
| <span id="UnknownChannelType"><span class="nx">UnknownChannelType</span></span> | |
| <span id="ResourceShortage"><span class="nx">ResourceShortage</span></span> | |
| <span class="p">)</span></pre> | |
| <h4 id="RejectionReason.String">func (RejectionReason) String</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">r</span> <a href="#RejectionReason"><span class="nx">RejectionReason</span></a><span class="p">)</span> <span class="nf">String</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>String converts the rejection reason to human readable form. | |
| <h3 id="Request">type Request</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Request</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span id="Request.Type"><span class="nx">Type</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Request.WantReply"><span class="nx">WantReply</span></span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a> | |
| <span id="Request.Payload"><span class="nx">Payload</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>Request is a request sent outside of the normal stream of | |
| data. Requests can either be specific to an SSH channel, or they | |
| can be global. | |
| <h4 id="Request.Reply">func (*Request) Reply</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">r</span> <span class="o">*</span><a href="#Request"><span class="nx">Request</span></a><span class="p">)</span> <span class="nf">Reply</span><span class="p">(</span><span class="nx">ok</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">,</span> <span class="nx">payload</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Reply sends a response to a request. It must be called for all requests | |
| where WantReply is true and is a no-op otherwise. The payload argument is | |
| ignored for replies to channel-specific requests. | |
| <h3 id="RequestHandler">type RequestHandler</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">RequestHandler</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span id="RequestHandler.NewRequest"><span class="nf">NewRequest</span></span><span class="p">(</span><span class="nx">req</span> <span class="o">*</span><a href="#Request"><span class="nx">Request</span></a><span class="p">)</span> | |
| <span class="p">}</span></pre> | |
| <p>RequestHandler defines the interface to handle new <a href="#Request">Request</a>.ListenTCP | |
| <h3 id="RequestHandlerFunc">type RequestHandlerFunc</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">RequestHandlerFunc</span> <span class="kd">func</span><span class="p">(</span><span class="nx">req</span> <span class="o">*</span><a href="#Request"><span class="nx">Request</span></a><span class="p">)</span></pre> | |
| <p>RequestHandlerFunc is an adapter to allow the use of ordinary function as | |
| <a href="#RequestHandler">RequestHandler</a>. If f is a function with the appropriate signature, | |
| RequestHandlerFunc(f) is a <a href="#RequestHandler">RequestHandler</a> that calls f. | |
| <h4 id="RequestHandlerFunc.NewRequest">func (RequestHandlerFunc) NewRequest</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">f</span> <a href="#RequestHandlerFunc"><span class="nx">RequestHandlerFunc</span></a><span class="p">)</span> <span class="nf">NewRequest</span><span class="p">(</span><span class="nx">req</span> <span class="o">*</span><a href="#Request"><span class="nx">Request</span></a><span class="p">)</span></pre> | |
| <p>NewRequest calls f(req). | |
| <h3 id="Server">type Server</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Server</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// Config contains configuration shared between client and server. | |
| </span><span class="c1"></span> <a href="#Config"><span class="nx">Config</span></a> | |
| <span class="c1">// PublicKeyAuthAlgorithms specifies the supported client public key | |
| </span><span class="c1"></span> <span class="c1">// authentication algorithms. Note that this should not include certificate | |
| </span><span class="c1"></span> <span class="c1">// types since those use the underlying algorithm. This list is sent to the | |
| </span><span class="c1"></span> <span class="c1">// client if it supports the server-sig-algs extension. Order is irrelevant. | |
| </span><span class="c1"></span> <span class="c1">// If unspecified then a default set of algorithms is used. | |
| </span><span class="c1"></span> <span id="Server.PublicKeyAuthAlgorithms"><span class="nx">PublicKeyAuthAlgorithms</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// NoClientAuth, if non-nil, is called when a user | |
| </span><span class="c1"></span> <span class="c1">// attempts to authenticate with auth method "none". | |
| </span><span class="c1"></span> <span id="Server.NoClientAuth"><span class="nx">NoClientAuth</span></span> <span class="kd">func</span><span class="p">(</span><a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// MaxAuthTries specifies the maximum number of authentication attempts | |
| </span><span class="c1"></span> <span class="c1">// permitted per connection. If set to a negative number, the number of | |
| </span><span class="c1"></span> <span class="c1">// attempts are unlimited. If set to zero, the number of attempts are limited | |
| </span><span class="c1"></span> <span class="c1">// to 6. | |
| </span><span class="c1"></span> <span id="Server.MaxAuthTries"><span class="nx">MaxAuthTries</span></span> <a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a> | |
| <span class="c1">// Password, if non-nil, is called when a user | |
| </span><span class="c1"></span> <span class="c1">// attempts to authenticate using a password. | |
| </span><span class="c1"></span> <span id="Server.Password"><span class="nx">Password</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">password</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// PublicKey, if non-nil, is called when a client | |
| </span><span class="c1"></span> <span class="c1">// offers a public key for authentication. It must return a nil error | |
| </span><span class="c1"></span> <span class="c1">// if the given public key can be used to authenticate the | |
| </span><span class="c1"></span> <span class="c1">// given user. For example, see CertChecker.Authenticate. A | |
| </span><span class="c1"></span> <span class="c1">// call to this function does not guarantee that the key | |
| </span><span class="c1"></span> <span class="c1">// offered is in fact used to authenticate. To record any data | |
| </span><span class="c1"></span> <span class="c1">// depending on the public key, store it inside a | |
| </span><span class="c1"></span> <span class="c1">// Permissions.Extensions entry. | |
| </span><span class="c1"></span> <span id="Server.PublicKey"><span class="nx">PublicKey</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">key</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// KeyboardInteractive, if non-nil, is called when | |
| </span><span class="c1"></span> <span class="c1">// keyboard-interactive authentication is selected (RFC | |
| </span><span class="c1"></span> <span class="c1">// 4256). The client object's Challenge function should be | |
| </span><span class="c1"></span> <span class="c1">// used to query the user. The callback may offer multiple | |
| </span><span class="c1"></span> <span class="c1">// Challenge rounds. To avoid information leaks, the client | |
| </span><span class="c1"></span> <span class="c1">// should be presented a challenge even if the user is | |
| </span><span class="c1"></span> <span class="c1">// unknown. | |
| </span><span class="c1"></span> <span id="Server.KeyboardInteractive"><span class="nx">KeyboardInteractive</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">client</span> <a href="#KeyboardInteractiveChallenge"><span class="nx">KeyboardInteractiveChallenge</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// AuthLog, if non-nil, is called to log all authentication | |
| </span><span class="c1"></span> <span class="c1">// attempts. | |
| </span><span class="c1"></span> <span id="Server.AuthLog"><span class="nx">AuthLog</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">method</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// ServerVersion is the version identification string to announce in | |
| </span><span class="c1"></span> <span class="c1">// the public handshake. | |
| </span><span class="c1"></span> <span class="c1">// If empty, a reasonable default is used. | |
| </span><span class="c1"></span> <span class="c1">// Note that RFC 4253 section 4.2 requires that this string start with | |
| </span><span class="c1"></span> <span class="c1">// "SSH-2.0-". | |
| </span><span class="c1"></span> <span id="Server.ServerVersion"><span class="nx">ServerVersion</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// BannerCallback, if present, is called and the return string is sent to | |
| </span><span class="c1"></span> <span class="c1">// the client after key exchange completed but before authentication. | |
| </span><span class="c1"></span> <span id="Server.Banner"><span class="nx">Banner</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="c1">// GSSAPIWithMICConfig includes gssapi server and callback, which if both non-nil, is used | |
| </span><span class="c1"></span> <span class="c1">// when gssapi-with-mic authentication is selected (RFC 4462 section 3). | |
| </span><span class="c1"></span> <span id="Server.GSSAPIWithMICConfig"><span class="nx">GSSAPIWithMICConfig</span></span> <span class="o">*</span><a href="#GSSAPIWithMICConfig"><span class="nx">GSSAPIWithMICConfig</span></a> | |
| <span class="c1">// HandshakeTimeout defines the timeout for the initial handshake, as milliseconds. | |
| </span><span class="c1"></span> <span id="Server.HandshakeTimeout"><span class="nx">HandshakeTimeout</span></span> <a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a> | |
| <span class="c1">// ConnectionFailed, if non-nil, is called to report handshake errors. | |
| </span><span class="c1"></span> <span id="Server.ConnectionFailed"><span class="nx">ConnectionFailed</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Conn"><span class="nx">Conn</span></a><span class="p">,</span> <span class="nx">err</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// ConnectionAddedCallback, if non-nil, is called when a client connects, by | |
| </span><span class="c1"></span> <span class="c1">// returning an error the connection will be refused. | |
| </span><span class="c1"></span> <span id="Server.ConnectionAdded"><span class="nx">ConnectionAdded</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Conn"><span class="nx">Conn</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a> | |
| <span class="c1">// ClientHandler defines the handler for authenticated clients. It is called | |
| </span><span class="c1"></span> <span class="c1">// if the handshake is successfull. The handler must serve requests and | |
| </span><span class="c1"></span> <span class="c1">// channels using [ServerConn.Handle]. | |
| </span><span class="c1"></span> <span id="Server.ClientHandler"><span class="nx">ClientHandler</span></span> <a href="#ClientHandler"><span class="nx">ClientHandler</span></a> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>Server holds server specific configuration data. | |
| <h4 id="Server.AddHostKey">func (*Server) AddHostKey</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Server"><span class="nx">Server</span></a><span class="p">)</span> <span class="nf">AddHostKey</span><span class="p">(</span><span class="nx">key</span> <a href="#Signer"><span class="nx">Signer</span></a><span class="p">)</span></pre> | |
| <p>AddHostKey adds a private key as a host key. If an existing host | |
| key exists with the same public key format, it is replaced. Each server | |
| config must have at least one host key. | |
| <details id="example-Server.AddHostKey" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"fmt"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"os"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="c1">// Minimal Server supporting only password authentication. | |
| </span><span class="c1"></span> <span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Server</span><span class="p">{</span> | |
| <span class="nx">Password</span><span class="p">:</span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">ConnMetadata</span><span class="p">,</span> <span class="nx">pass</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// Should use constant-time compare (or better, salt+hash) in | |
| </span><span class="c1"></span> <span class="c1">// a production setting. | |
| </span><span class="c1"></span> <span class="k">if</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">()</span> <span class="o">==</span> <span class="s">"testuser"</span> <span class="o">&&</span> <span class="nb">string</span><span class="p">(</span><span class="nx">pass</span><span class="p">)</span> <span class="o">==</span> <span class="s">"tiger"</span> <span class="p">{</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="kc">nil</span> | |
| <span class="p">}</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">"password rejected for %q"</span><span class="p">,</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">())</span> | |
| <span class="p">},</span> | |
| <span class="p">}</span> | |
| <span class="nx">privateBytes</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">"id_rsa"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to load private key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">private</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">ParsePrivateKey</span><span class="p">(</span><span class="nx">privateBytes</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to parse private key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Restrict host key algorithms to disable ssh-rsa. | |
| </span><span class="c1"></span> <span class="nx">signer</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">NewSignerWithAlgorithms</span><span class="p">(</span><span class="nx">private</span><span class="p">,</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">KeyAlgoRSASHA256</span><span class="p">,</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">KeyAlgoRSASHA512</span><span class="p">})</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to create private key with restricted algorithms: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">config</span><span class="p">.</span><span class="nf">AddHostKey</span><span class="p">(</span><span class="nx">signer</span><span class="p">)</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="Server.Close">func (*Server) Close</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Server"><span class="nx">Server</span></a><span class="p">)</span> <span class="nf">Close</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Close immediately closes all active net.Listeners. | |
| <h4 id="Server.ListenAndServe">func (*Server) ListenAndServe</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Server"><span class="nx">Server</span></a><span class="p">)</span> <span class="nf">ListenAndServe</span><span class="p">(</span><span class="nx">addr</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <details id="example-Server.ListenAndServe" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"fmt"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"net"</span> | |
| <span class="s">"os"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="s">"golang.org/x/term"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="c1">// Public key authentication is done by comparing | |
| </span><span class="c1"></span> <span class="c1">// the public key of a received connection | |
| </span><span class="c1"></span> <span class="c1">// with the entries in the authorized_keys file. | |
| </span><span class="c1"></span> <span class="nx">authorizedKeysBytes</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">"authorized_keys"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"Failed to load authorized_keys, err: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">authorizedKeysMap</span> <span class="o">:=</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">bool</span><span class="p">{}</span> | |
| <span class="k">for</span> <span class="nb">len</span><span class="p">(</span><span class="nx">authorizedKeysBytes</span><span class="p">)</span> <span class="p">></span> <span class="mi">0</span> <span class="p">{</span> | |
| <span class="nx">pubKey</span><span class="p">,</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">rest</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">ParseAuthorizedKey</span><span class="p">(</span><span class="nx">authorizedKeysBytes</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">authorizedKeysMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">pubKey</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">())]</span> <span class="p">=</span> <span class="kc">true</span> | |
| <span class="nx">authorizedKeysBytes</span> <span class="p">=</span> <span class="nx">rest</span> | |
| <span class="p">}</span> | |
| <span class="c1">// An SSH server is represented by a Server, which holds | |
| </span><span class="c1"></span> <span class="c1">// certificate details and handles authentication of ServerConns. | |
| </span><span class="c1"></span> <span class="nx">server</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Server</span><span class="p">{</span> | |
| <span class="c1">// Remove to disable password auth. | |
| </span><span class="c1"></span> <span class="nx">Password</span><span class="p">:</span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">ConnMetadata</span><span class="p">,</span> <span class="nx">pass</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// Should use constant-time compare (or better, salt+hash) in | |
| </span><span class="c1"></span> <span class="c1">// a production setting. | |
| </span><span class="c1"></span> <span class="k">if</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">()</span> <span class="o">==</span> <span class="s">"testuser"</span> <span class="o">&&</span> <span class="nb">string</span><span class="p">(</span><span class="nx">pass</span><span class="p">)</span> <span class="o">==</span> <span class="s">"tiger"</span> <span class="p">{</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="kc">nil</span> | |
| <span class="p">}</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">"password rejected for %q"</span><span class="p">,</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">())</span> | |
| <span class="p">},</span> | |
| <span class="c1">// Remove to disable public key auth. | |
| </span><span class="c1"></span> <span class="nx">PublicKey</span><span class="p">:</span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">ConnMetadata</span><span class="p">,</span> <span class="nx">pubKey</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">PublicKey</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="k">if</span> <span class="nx">authorizedKeysMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">pubKey</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">())]</span> <span class="p">{</span> | |
| <span class="k">return</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">{</span> | |
| <span class="c1">// Record the public key used for authentication. | |
| </span><span class="c1"></span> <span class="nx">Extensions</span><span class="p">:</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span> | |
| <span class="s">"pubkey-fp"</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">FingerprintSHA256</span><span class="p">(</span><span class="nx">pubKey</span><span class="p">),</span> | |
| <span class="p">},</span> | |
| <span class="p">},</span> <span class="kc">nil</span> | |
| <span class="p">}</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">"unknown public key for %q"</span><span class="p">,</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">())</span> | |
| <span class="p">},</span> | |
| <span class="nx">ConnectionFailed</span><span class="p">:</span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <span class="nx">net</span><span class="p">.</span><span class="nx">Conn</span><span class="p">,</span> <span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// Here we can get the error if an handshake fails | |
| </span><span class="c1"></span> <span class="p">},</span> | |
| <span class="nx">ClientHandler</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">ClientHandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">ServerConn</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="nx">conn</span><span class="p">.</span><span class="nf">Handle</span><span class="p">(</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nf">ChannelHandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">newChannel</span> <span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">NewChannel</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// In this handler we have to accept and use the new channel or reject it. | |
| </span><span class="c1"></span> | |
| <span class="c1">// Channels have a type, depending on the application level | |
| </span><span class="c1"></span> <span class="c1">// protocol intended. In the case of a shell, the type is | |
| </span><span class="c1"></span> <span class="c1">// "session" and ServerShell may be used to present a simple | |
| </span><span class="c1"></span> <span class="c1">// terminal interface. | |
| </span><span class="c1"></span> <span class="k">if</span> <span class="nx">newChannel</span><span class="p">.</span><span class="nf">ChannelType</span><span class="p">()</span> <span class="o">!=</span> <span class="s">"session"</span> <span class="p">{</span> | |
| <span class="nx">newChannel</span><span class="p">.</span><span class="nf">Reject</span><span class="p">(</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">UnknownChannelType</span><span class="p">,</span> <span class="s">"unknown channel type"</span><span class="p">)</span> | |
| <span class="k">return</span> | |
| <span class="p">}</span> | |
| <span class="nx">channel</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">newChannel</span><span class="p">.</span><span class="nf">Accept</span><span class="p">()</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"Could not accept channel: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">err</span> <span class="p">=</span> <span class="nx">channel</span><span class="p">.</span><span class="nf">Handle</span><span class="p">(</span><span class="nx">ssh</span><span class="p">.</span><span class="nf">RequestHandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">req</span> <span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// Sessions have out-of-band requests such as "shell", | |
| </span><span class="c1"></span> <span class="c1">// "pty-req" and "env". Here we handle only the | |
| </span><span class="c1"></span> <span class="c1">// "shell" request. | |
| </span><span class="c1"></span> <span class="nx">req</span><span class="p">.</span><span class="nf">Reply</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">Type</span> <span class="o">==</span> <span class="s">"shell"</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> | |
| <span class="p">}))</span> | |
| <span class="nx">terminal</span> <span class="o">:=</span> <span class="nx">term</span><span class="p">.</span><span class="nf">NewTerminal</span><span class="p">(</span><span class="nx">channel</span><span class="p">,</span> <span class="s">"> "</span><span class="p">)</span> | |
| <span class="k">go</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="k">defer</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="nx">channel</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="p">}()</span> | |
| <span class="k">for</span> <span class="p">{</span> | |
| <span class="nx">line</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">terminal</span><span class="p">.</span><span class="nf">ReadLine</span><span class="p">()</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="k">break</span> | |
| <span class="p">}</span> | |
| <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">line</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="p">}()</span> | |
| <span class="p">}),</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nf">RequestHandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">req</span> <span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="k">if</span> <span class="nx">req</span><span class="p">.</span><span class="nx">WantReply</span> <span class="p">{</span> | |
| <span class="nx">req</span><span class="p">.</span><span class="nf">Reply</span><span class="p">(</span><span class="kc">false</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="p">}),</span> | |
| <span class="p">)</span> | |
| <span class="p">}),</span> | |
| <span class="p">}</span> | |
| <span class="nx">privateBytes</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">"id_rsa"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to load private key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">private</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">ParsePrivateKey</span><span class="p">(</span><span class="nx">privateBytes</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to parse private key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">server</span><span class="p">.</span><span class="nf">AddHostKey</span><span class="p">(</span><span class="nx">private</span><span class="p">)</span> | |
| <span class="nx">server</span><span class="p">.</span><span class="nf">ListenAndServe</span><span class="p">(</span><span class="s">"0.0.0.0:2022"</span><span class="p">)</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="Server.Serve">func (*Server) Serve</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Server"><span class="nx">Server</span></a><span class="p">)</span> <span class="nf">Serve</span><span class="p">(</span><span class="nx">l</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Listener"><span class="nx">Listener</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Serve accepts incoming connections on the Listener l, creating a new service | |
| goroutine for each and execute the provided <a href="#ClientHandler">ClientHandler</a> implementation. | |
| <h3 id="ServerAuthCallbacks">type ServerAuthCallbacks</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ServerAuthCallbacks</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// Password behaves like [Server.PasswordCallback]. | |
| </span><span class="c1"></span> <span id="ServerAuthCallbacks.Password"><span class="nx">Password</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">password</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// PublicKey behaves like [Server.PublicKeyCallback]. | |
| </span><span class="c1"></span> <span id="ServerAuthCallbacks.PublicKey"><span class="nx">PublicKey</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">key</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// KeyboardInteractive behaves like [Server.KeyboardInteractiveCallback]. | |
| </span><span class="c1"></span> <span id="ServerAuthCallbacks.KeyboardInteractive"><span class="nx">KeyboardInteractive</span></span> <span class="kd">func</span><span class="p">(</span><span class="nx">conn</span> <a href="#ConnMetadata"><span class="nx">ConnMetadata</span></a><span class="p">,</span> <span class="nx">client</span> <a href="#KeyboardInteractiveChallenge"><span class="nx">KeyboardInteractiveChallenge</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// GSSAPIWithMICConfig behaves like [Server.GSSAPIWithMICConfig]. | |
| </span><span class="c1"></span> <span id="ServerAuthCallbacks.GSSAPIWithMICConfig"><span class="nx">GSSAPIWithMICConfig</span></span> <span class="o">*</span><a href="#GSSAPIWithMICConfig"><span class="nx">GSSAPIWithMICConfig</span></a> | |
| <span class="p">}</span></pre> | |
| <p>ServerAuthCallbacks defines server-side authentication callbacks. | |
| <h3 id="ServerAuthError">type ServerAuthError</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ServerAuthError</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// Errors contains authentication errors returned by the authentication | |
| </span><span class="c1"></span> <span class="c1">// callback methods. The first entry is typically ErrNoAuth. | |
| </span><span class="c1"></span> <span id="ServerAuthError.Errors"><span class="nx">Errors</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a> | |
| <span class="p">}</span></pre> | |
| <p>ServerAuthError represents server authentication errors and is | |
| sometimes returned by NewServerConn. It appends any authentication | |
| errors that may occur, and is returned if all of the authentication | |
| methods provided by the user failed to authenticate. | |
| <h4 id="ServerAuthError.Error">func (ServerAuthError) Error</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">l</span> <a href="#ServerAuthError"><span class="nx">ServerAuthError</span></a><span class="p">)</span> <span class="nf">Error</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h3 id="ServerConn">type ServerConn</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">ServerConn</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// If the succeeding authentication callback returned a | |
| </span><span class="c1"></span> <span class="c1">// non-nil Permissions pointer, it is stored here. | |
| </span><span class="c1"></span> <span id="ServerConn.Permissions"><span class="nx">Permissions</span></span> <span class="o">*</span><a href="#Permissions"><span class="nx">Permissions</span></a> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>ServerConn is an authenticated SSH connection, as seen from the | |
| server | |
| <h4 id="NewServerConn">func NewServerConn</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">NewServerConn</span><span class="p">(</span><span class="nx">ctx</span> <a href="https://pkg.go.dev/context"><span class="nx">context</span></a><span class="p">.</span><a href="https://pkg.go.dev/context#Context"><span class="nx">Context</span></a><span class="p">,</span> <span class="nx">c</span> <a href="https://pkg.go.dev/net"><span class="nx">net</span></a><span class="p">.</span><a href="https://pkg.go.dev/net#Conn"><span class="nx">Conn</span></a><span class="p">,</span> <span class="nx">config</span> <span class="o">*</span><a href="#Server"><span class="nx">Server</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#ServerConn"><span class="nx">ServerConn</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>NewServerConn starts a new SSH server with c as the underlying | |
| transport. It starts with a handshake and, if the handshake is | |
| unsuccessful, it closes the connection and returns an error. The | |
| Request and NewChannel channels must be serviced, or the connection | |
| will hang. | |
| <p>The returned error may be of type *ServerAuthError for | |
| authentication errors. | |
| <p>This is a low level API useful for advanced use cases, you must use | |
| <a href="#ServerConn.Handle">ServerConn.Handle</a> to handle Requests and Channels. | |
| <details id="example-NewServerConn" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"context"</span> | |
| <span class="s">"fmt"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"net"</span> | |
| <span class="s">"os"</span> | |
| <span class="s">"sync"</span> | |
| <span class="s">"time"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="s">"golang.org/x/term"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="c1">// Public key authentication is done by comparing | |
| </span><span class="c1"></span> <span class="c1">// the public key of a received connection | |
| </span><span class="c1"></span> <span class="c1">// with the entries in the authorized_keys file. | |
| </span><span class="c1"></span> <span class="nx">authorizedKeysBytes</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">"authorized_keys"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"Failed to load authorized_keys, err: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">authorizedKeysMap</span> <span class="o">:=</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">bool</span><span class="p">{}</span> | |
| <span class="k">for</span> <span class="nb">len</span><span class="p">(</span><span class="nx">authorizedKeysBytes</span><span class="p">)</span> <span class="p">></span> <span class="mi">0</span> <span class="p">{</span> | |
| <span class="nx">pubKey</span><span class="p">,</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">rest</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">ParseAuthorizedKey</span><span class="p">(</span><span class="nx">authorizedKeysBytes</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">authorizedKeysMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">pubKey</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">())]</span> <span class="p">=</span> <span class="kc">true</span> | |
| <span class="nx">authorizedKeysBytes</span> <span class="p">=</span> <span class="nx">rest</span> | |
| <span class="p">}</span> | |
| <span class="c1">// An SSH server is represented by a Server, which holds | |
| </span><span class="c1"></span> <span class="c1">// certificate details and handles authentication of ServerConns. | |
| </span><span class="c1"></span> <span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Server</span><span class="p">{</span> | |
| <span class="c1">// Remove to disable password auth. | |
| </span><span class="c1"></span> <span class="nx">Password</span><span class="p">:</span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">ConnMetadata</span><span class="p">,</span> <span class="nx">pass</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// Should use constant-time compare (or better, salt+hash) in | |
| </span><span class="c1"></span> <span class="c1">// a production setting. | |
| </span><span class="c1"></span> <span class="k">if</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">()</span> <span class="o">==</span> <span class="s">"testuser"</span> <span class="o">&&</span> <span class="nb">string</span><span class="p">(</span><span class="nx">pass</span><span class="p">)</span> <span class="o">==</span> <span class="s">"tiger"</span> <span class="p">{</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="kc">nil</span> | |
| <span class="p">}</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">"password rejected for %q"</span><span class="p">,</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">())</span> | |
| <span class="p">},</span> | |
| <span class="c1">// Remove to disable public key auth. | |
| </span><span class="c1"></span> <span class="nx">PublicKey</span><span class="p">:</span> <span class="kd">func</span><span class="p">(</span><span class="nx">c</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">ConnMetadata</span><span class="p">,</span> <span class="nx">pubKey</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">PublicKey</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="k">if</span> <span class="nx">authorizedKeysMap</span><span class="p">[</span><span class="nb">string</span><span class="p">(</span><span class="nx">pubKey</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">())]</span> <span class="p">{</span> | |
| <span class="k">return</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">{</span> | |
| <span class="c1">// Record the public key used for authentication. | |
| </span><span class="c1"></span> <span class="nx">Extensions</span><span class="p">:</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span> | |
| <span class="s">"pubkey-fp"</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">FingerprintSHA256</span><span class="p">(</span><span class="nx">pubKey</span><span class="p">),</span> | |
| <span class="p">},</span> | |
| <span class="p">},</span> <span class="kc">nil</span> | |
| <span class="p">}</span> | |
| <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">"unknown public key for %q"</span><span class="p">,</span> <span class="nx">c</span><span class="p">.</span><span class="nf">User</span><span class="p">())</span> | |
| <span class="p">},</span> | |
| <span class="p">}</span> | |
| <span class="nx">privateBytes</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">"id_rsa"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to load private key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">private</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">ParsePrivateKey</span><span class="p">(</span><span class="nx">privateBytes</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"Failed to parse private key: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">config</span><span class="p">.</span><span class="nf">AddHostKey</span><span class="p">(</span><span class="nx">private</span><span class="p">)</span> | |
| <span class="c1">// Once a Server has been configured, connections can be | |
| </span><span class="c1"></span> <span class="c1">// accepted. | |
| </span><span class="c1"></span> <span class="nx">listener</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">net</span><span class="p">.</span><span class="nf">Listen</span><span class="p">(</span><span class="s">"tcp"</span><span class="p">,</span> <span class="s">"0.0.0.0:2022"</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"failed to listen for connection: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">nConn</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">listener</span><span class="p">.</span><span class="nf">Accept</span><span class="p">()</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"failed to accept incoming connection: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Allow at most 10 seconds to complete the handshake and create the | |
| </span><span class="c1"></span> <span class="c1">// server connection. | |
| </span><span class="c1"></span> <span class="nx">ctx</span><span class="p">,</span> <span class="nx">cancel</span> <span class="o">:=</span> <span class="nx">context</span><span class="p">.</span><span class="nf">WithTimeout</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">(),</span> <span class="mi">10</span><span class="o">*</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span> | |
| <span class="k">defer</span> <span class="nf">cancel</span><span class="p">()</span> | |
| <span class="c1">// Before use, a handshake must be performed on the incoming | |
| </span><span class="c1"></span> <span class="c1">// net.Conn. | |
| </span><span class="c1"></span> <span class="nx">conn</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">NewServerConn</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">nConn</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"failed to handshake: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">"logged in with key %s"</span><span class="p">,</span> <span class="nx">conn</span><span class="p">.</span><span class="nx">Permissions</span><span class="p">.</span><span class="nx">Extensions</span><span class="p">[</span><span class="s">"pubkey-fp"</span><span class="p">])</span> | |
| <span class="kd">var</span> <span class="nx">wg</span> <span class="nx">sync</span><span class="p">.</span><span class="nx">WaitGroup</span> | |
| <span class="k">defer</span> <span class="nx">wg</span><span class="p">.</span><span class="nf">Wait</span><span class="p">()</span> | |
| <span class="nx">conn</span><span class="p">.</span><span class="nf">Handle</span><span class="p">(</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nf">ChannelHandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">newChannel</span> <span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">NewChannel</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// Channels have a type, depending on the application level | |
| </span><span class="c1"></span> <span class="c1">// protocol intended. In the case of a shell, the type is | |
| </span><span class="c1"></span> <span class="c1">// "session" and ServerShell may be used to present a simple | |
| </span><span class="c1"></span> <span class="c1">// terminal interface. | |
| </span><span class="c1"></span> <span class="k">if</span> <span class="nx">newChannel</span><span class="p">.</span><span class="nf">ChannelType</span><span class="p">()</span> <span class="o">!=</span> <span class="s">"session"</span> <span class="p">{</span> | |
| <span class="nx">newChannel</span><span class="p">.</span><span class="nf">Reject</span><span class="p">(</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">UnknownChannelType</span><span class="p">,</span> <span class="s">"unknown channel type"</span><span class="p">)</span> | |
| <span class="k">return</span> | |
| <span class="p">}</span> | |
| <span class="nx">channel</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">newChannel</span><span class="p">.</span><span class="nf">Accept</span><span class="p">()</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"Could not accept channel: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">err</span> <span class="p">=</span> <span class="nx">channel</span><span class="p">.</span><span class="nf">Handle</span><span class="p">(</span><span class="nx">ssh</span><span class="p">.</span><span class="nf">RequestHandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">req</span> <span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="c1">// Sessions have out-of-band requests such as "shell", | |
| </span><span class="c1"></span> <span class="c1">// "pty-req" and "env". Here we handle only the | |
| </span><span class="c1"></span> <span class="c1">// "shell" request. | |
| </span><span class="c1"></span> <span class="nx">req</span><span class="p">.</span><span class="nf">Reply</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">Type</span> <span class="o">==</span> <span class="s">"shell"</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> | |
| <span class="p">}))</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatalf</span><span class="p">(</span><span class="s">"Could not handle channel: %v"</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="nx">terminal</span> <span class="o">:=</span> <span class="nx">term</span><span class="p">.</span><span class="nf">NewTerminal</span><span class="p">(</span><span class="nx">channel</span><span class="p">,</span> <span class="s">"> "</span><span class="p">)</span> | |
| <span class="nx">wg</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> | |
| <span class="k">go</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="k">defer</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="nx">channel</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="nx">wg</span><span class="p">.</span><span class="nf">Done</span><span class="p">()</span> | |
| <span class="p">}()</span> | |
| <span class="k">for</span> <span class="p">{</span> | |
| <span class="nx">line</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">terminal</span><span class="p">.</span><span class="nf">ReadLine</span><span class="p">()</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="k">break</span> | |
| <span class="p">}</span> | |
| <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">line</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="p">}()</span> | |
| <span class="p">}),</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nf">RequestHandlerFunc</span><span class="p">(</span><span class="kd">func</span><span class="p">(</span><span class="nx">req</span> <span class="o">*</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="p">{</span> | |
| <span class="k">if</span> <span class="nx">req</span><span class="p">.</span><span class="nx">WantReply</span> <span class="p">{</span> | |
| <span class="nx">req</span><span class="p">.</span><span class="nf">Reply</span><span class="p">(</span><span class="kc">false</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="p">}))</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="ServerConn.Close">func (*ServerConn) Close</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#ServerConn"><span class="nx">ServerConn</span></a><span class="p">)</span> <span class="nf">Close</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Close closes the underlying network connection. | |
| <h4 id="ServerConn.Handle">func (*ServerConn) Handle</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><a href="#ServerConn"><span class="nx">ServerConn</span></a><span class="p">)</span> <span class="nf">Handle</span><span class="p">(</span><span class="nx">channelHandler</span> <a href="#ChannelHandler"><span class="nx">ChannelHandler</span></a><span class="p">,</span> <span class="nx">requestHandler</span> <a href="#RequestHandler"><span class="nx">RequestHandler</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Handle must be called to handle requests and channels. Handle blocks. If | |
| channelHandler is nil channels will be rejected. If requestHandler is nil, | |
| requests will be discarded. | |
| <h3 id="Session">type Session</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Session</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// Stdin specifies the remote process's standard input. | |
| </span><span class="c1"></span> <span class="c1">// If Stdin is nil, the remote process reads from an empty | |
| </span><span class="c1"></span> <span class="c1">// bytes.Buffer. | |
| </span><span class="c1"></span> <span id="Session.Stdin"><span class="nx">Stdin</span></span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Reader"><span class="nx">Reader</span></a> | |
| <span class="c1">// Stdout and Stderr specify the remote process's standard | |
| </span><span class="c1"></span> <span class="c1">// output and error. | |
| </span><span class="c1"></span> <span class="c1">// | |
| </span><span class="c1"></span> <span class="c1">// If either is nil, Run connects the corresponding file | |
| </span><span class="c1"></span> <span class="c1">// descriptor to an instance of io.Discard. There is a | |
| </span><span class="c1"></span> <span class="c1">// fixed amount of buffering that is shared for the two streams. | |
| </span><span class="c1"></span> <span class="c1">// If either blocks it may eventually cause the remote | |
| </span><span class="c1"></span> <span class="c1">// command to block. | |
| </span><span class="c1"></span> <span id="Session.Stdout"><span class="nx">Stdout</span></span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Writer"><span class="nx">Writer</span></a> | |
| <span id="Session.Stderr"><span class="nx">Stderr</span></span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Writer"><span class="nx">Writer</span></a> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>A Session represents a connection to a remote command or shell. | |
| <h4 id="Session.Close">func (*Session) Close</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Close</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <h4 id="Session.CombinedOutput">func (*Session) CombinedOutput</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">CombinedOutput</span><span class="p">(</span><span class="nx">cmd</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">([]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>CombinedOutput runs cmd on the remote host and returns its combined | |
| standard output and standard error. | |
| <h4 id="Session.Output">func (*Session) Output</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Output</span><span class="p">(</span><span class="nx">cmd</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">([]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>Output runs cmd on the remote host and returns its standard output. | |
| <h4 id="Session.RequestPty">func (*Session) RequestPty</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">RequestPty</span><span class="p">(</span><span class="nx">term</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">h</span><span class="p">,</span> <span class="nx">w</span> <a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a><span class="p">,</span> <span class="nx">termmodes</span> <a href="#TerminalModes"><span class="nx">TerminalModes</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>RequestPty requests the association of a pty with the session on the remote host. | |
| <details id="example-Session.RequestPty" class="example"> | |
| <summary>Example</summary> | |
| <pre class="chroma"><span class="kn">package</span> <span class="nx">main</span> | |
| <span class="kn">import</span> <span class="p">(</span> | |
| <span class="s">"context"</span> | |
| <span class="s">"log"</span> | |
| <span class="s">"golang.org/x/crypto/ssh"</span> | |
| <span class="p">)</span> | |
| <span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="kd">var</span> <span class="nx">hostKey</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">PublicKey</span> | |
| <span class="c1">// Create client config | |
| </span><span class="c1"></span> <span class="nx">config</span> <span class="o">:=</span> <span class="o">&</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">ClientConfig</span><span class="p">{</span> | |
| <span class="nx">User</span><span class="p">:</span> <span class="s">"username"</span><span class="p">,</span> | |
| <span class="nx">Auth</span><span class="p">:</span> <span class="p">[]</span><span class="nx">ssh</span><span class="p">.</span><span class="nx">AuthMethod</span><span class="p">{</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nf">Password</span><span class="p">(</span><span class="s">"password"</span><span class="p">),</span> | |
| <span class="p">},</span> | |
| <span class="nx">HostKey</span><span class="p">:</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">FixedHostKey</span><span class="p">(</span><span class="nx">hostKey</span><span class="p">),</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Connect to ssh server | |
| </span><span class="c1"></span> <span class="nx">conn</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nf">Dial</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">(),</span> <span class="s">"tcp"</span><span class="p">,</span> <span class="s">"localhost:22"</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to connect: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="k">defer</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="c1">// Create a session | |
| </span><span class="c1"></span> <span class="nx">session</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">NewSession</span><span class="p">()</span> | |
| <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"unable to create session: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="k">defer</span> <span class="nx">session</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> | |
| <span class="c1">// Set up terminal modes | |
| </span><span class="c1"></span> <span class="nx">modes</span> <span class="o">:=</span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">TerminalModes</span><span class="p">{</span> | |
| <span class="nx">ssh</span><span class="p">.</span><span class="nx">ECHO</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// disable echoing | |
| </span><span class="c1"></span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">TTY_OP_ISPEED</span><span class="p">:</span> <span class="mi">14400</span><span class="p">,</span> <span class="c1">// input speed = 14.4kbaud | |
| </span><span class="c1"></span> <span class="nx">ssh</span><span class="p">.</span><span class="nx">TTY_OP_OSPEED</span><span class="p">:</span> <span class="mi">14400</span><span class="p">,</span> <span class="c1">// output speed = 14.4kbaud | |
| </span><span class="c1"></span> <span class="p">}</span> | |
| <span class="c1">// Request pseudo terminal | |
| </span><span class="c1"></span> <span class="k">if</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">session</span><span class="p">.</span><span class="nf">RequestPty</span><span class="p">(</span><span class="s">"xterm"</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">80</span><span class="p">,</span> <span class="nx">modes</span><span class="p">);</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"request for pseudo terminal failed: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="c1">// Start remote shell | |
| </span><span class="c1"></span> <span class="k">if</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">session</span><span class="p">.</span><span class="nf">Shell</span><span class="p">();</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> | |
| <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="s">"failed to start shell: "</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| <span class="p">}</span></pre> | |
| </details> | |
| <h4 id="Session.RequestSubsystem">func (*Session) RequestSubsystem</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">RequestSubsystem</span><span class="p">(</span><span class="nx">subsystem</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>RequestSubsystem requests the association of a subsystem with the session on the remote host. | |
| A subsystem is a predefined command that runs in the background when the ssh session is initiated | |
| <h4 id="Session.Run">func (*Session) Run</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Run</span><span class="p">(</span><span class="nx">cmd</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Run runs cmd on the remote host. Typically, the remote | |
| server passes cmd to the shell for interpretation. | |
| A Session only accepts one call to Run, Start, Shell, Output, | |
| or CombinedOutput. | |
| <p>The returned error is nil if the command runs, has no problems | |
| copying stdin, stdout, and stderr, and exits with a zero exit | |
| status. | |
| <p>If the remote server does not send an exit status, an error of type | |
| *ExitMissingError is returned. If the command completes | |
| unsuccessfully or is interrupted by a signal, the error is of type | |
| *ExitError. Other error types may be returned for I/O problems. | |
| <h4 id="Session.SendRequest">func (*Session) SendRequest</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">SendRequest</span><span class="p">(</span><span class="nx">name</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">,</span> <span class="nx">wantReply</span> <a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">,</span> <span class="nx">payload</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><a href="https://pkg.go.dev/builtin#bool"><span class="kt">bool</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>SendRequest sends an out-of-band channel request on the SSH channel | |
| underlying the session. | |
| <h4 id="Session.Setenv">func (*Session) Setenv</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Setenv</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">value</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Setenv sets an environment variable that will be applied to any | |
| command executed by Shell or Run. | |
| <h4 id="Session.Shell">func (*Session) Shell</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Shell</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Shell starts a login shell on the remote host. A Session only | |
| accepts one call to Run, Start, Shell, Output, or CombinedOutput. | |
| <h4 id="Session.Signal">func (*Session) Signal</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Signal</span><span class="p">(</span><span class="nx">sig</span> <a href="#Signal"><span class="nx">Signal</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Signal sends the given signal to the remote process. | |
| sig is one of the SIG* constants. | |
| <h4 id="Session.Start">func (*Session) Start</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Start</span><span class="p">(</span><span class="nx">cmd</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Start runs cmd on the remote host. Typically, the remote | |
| server passes cmd to the shell for interpretation. | |
| A Session only accepts one call to Run, Start or Shell. | |
| <h4 id="Session.StderrPipe">func (*Session) StderrPipe</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">StderrPipe</span><span class="p">()</span> <span class="p">(</span><a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Reader"><span class="nx">Reader</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>StderrPipe returns a pipe that will be connected to the | |
| remote command's standard error when the command starts. | |
| There is a fixed amount of buffering that is shared between | |
| stdout and stderr streams. If the StderrPipe reader is | |
| not serviced fast enough it may eventually cause the | |
| remote command to block. | |
| <h4 id="Session.StdinPipe">func (*Session) StdinPipe</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">StdinPipe</span><span class="p">()</span> <span class="p">(</span><a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#WriteCloser"><span class="nx">WriteCloser</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>StdinPipe returns a pipe that will be connected to the | |
| remote command's standard input when the command starts. | |
| <h4 id="Session.StdoutPipe">func (*Session) StdoutPipe</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">StdoutPipe</span><span class="p">()</span> <span class="p">(</span><a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Reader"><span class="nx">Reader</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>StdoutPipe returns a pipe that will be connected to the | |
| remote command's standard output when the command starts. | |
| There is a fixed amount of buffering that is shared between | |
| stdout and stderr streams. If the StdoutPipe reader is | |
| not serviced fast enough it may eventually cause the | |
| remote command to block. | |
| <h4 id="Session.Wait">func (*Session) Wait</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">Wait</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>Wait waits for the remote command to exit. | |
| <p>The returned error is nil if the command runs, has no problems | |
| copying stdin, stdout, and stderr, and exits with a zero exit | |
| status. | |
| <p>If the remote server does not send an exit status, an error of type | |
| *ExitMissingError is returned. If the command completes | |
| unsuccessfully or is interrupted by a signal, the error is of type | |
| *ExitError. Other error types may be returned for I/O problems. | |
| <h4 id="Session.WindowChange">func (*Session) WindowChange</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><a href="#Session"><span class="nx">Session</span></a><span class="p">)</span> <span class="nf">WindowChange</span><span class="p">(</span><span class="nx">h</span><span class="p">,</span> <span class="nx">w</span> <a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a><span class="p">)</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a></pre> | |
| <p>WindowChange informs the remote host about a terminal window dimension change to h rows and w columns. | |
| <h3 id="Signal">type Signal</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Signal</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <pre class="chroma"><span class="kd">const</span> <span class="p">(</span> | |
| <span id="SIGABRT"><span class="nx">SIGABRT</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"ABRT"</span> | |
| <span id="SIGALRM"><span class="nx">SIGALRM</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"ALRM"</span> | |
| <span id="SIGFPE"><span class="nx">SIGFPE</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"FPE"</span> | |
| <span id="SIGHUP"><span class="nx">SIGHUP</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"HUP"</span> | |
| <span id="SIGILL"><span class="nx">SIGILL</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"ILL"</span> | |
| <span id="SIGINT"><span class="nx">SIGINT</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"INT"</span> | |
| <span id="SIGKILL"><span class="nx">SIGKILL</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"KILL"</span> | |
| <span id="SIGPIPE"><span class="nx">SIGPIPE</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"PIPE"</span> | |
| <span id="SIGQUIT"><span class="nx">SIGQUIT</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"QUIT"</span> | |
| <span id="SIGSEGV"><span class="nx">SIGSEGV</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"SEGV"</span> | |
| <span id="SIGTERM"><span class="nx">SIGTERM</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"TERM"</span> | |
| <span id="SIGUSR1"><span class="nx">SIGUSR1</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"USR1"</span> | |
| <span id="SIGUSR2"><span class="nx">SIGUSR2</span></span> <a href="#Signal"><span class="nx">Signal</span></a> <span class="p">=</span> <span class="s">"USR2"</span> | |
| <span class="p">)</span></pre> | |
| <p>POSIX signals as listed in RFC 4254 Section 6.10. | |
| <h3 id="Signature">type Signature</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Signature</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span id="Signature.Format"><span class="nx">Format</span></span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span id="Signature.Blob"><span class="nx">Blob</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a> | |
| <span id="Signature.Rest"><span class="nx">Rest</span></span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a> <span class="s">`ssh:"rest"`</span> | |
| <span class="p">}</span></pre> | |
| <p>Signature represents a cryptographic signature. | |
| <h3 id="Signer">type Signer</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Signer</span> <span class="kd">interface</span> <span class="p">{</span> | |
| <span class="c1">// PublicKey returns the associated PublicKey. | |
| </span><span class="c1"></span> <span id="Signer.PublicKey"><span class="nf">PublicKey</span></span><span class="p">()</span> <a href="#PublicKey"><span class="nx">PublicKey</span></a> | |
| <span class="c1">// Sign returns a signature for the given data. This method will hash the | |
| </span><span class="c1"></span> <span class="c1">// data appropriately first. The signature algorithm is expected to match | |
| </span><span class="c1"></span> <span class="c1">// the key format returned by the PublicKey.Type method (and not to be any | |
| </span><span class="c1"></span> <span class="c1">// alternative algorithm supported by the key format). | |
| </span><span class="c1"></span> <span id="Signer.Sign"><span class="nf">Sign</span></span><span class="p">(</span><span class="nx">rand</span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Reader"><span class="nx">Reader</span></a><span class="p">,</span> <span class="nx">data</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Signature"><span class="nx">Signature</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// SignWithAlgorithm is like Signer.Sign, but allows specifying a desired | |
| </span><span class="c1"></span> <span class="c1">// signing algorithm. Callers may pass an empty string for the algorithm in | |
| </span><span class="c1"></span> <span class="c1">// which case the AlgorithmSigner will use a default algorithm. This default | |
| </span><span class="c1"></span> <span class="c1">// doesn't currently control any behavior in this package. | |
| </span><span class="c1"></span> <span id="Signer.SignWithAlgorithm"><span class="nf">SignWithAlgorithm</span></span><span class="p">(</span><span class="nx">rand</span> <a href="https://pkg.go.dev/io"><span class="nx">io</span></a><span class="p">.</span><a href="https://pkg.go.dev/io#Reader"><span class="nx">Reader</span></a><span class="p">,</span> <span class="nx">data</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#byte"><span class="kt">byte</span></a><span class="p">,</span> <span class="nx">algorithm</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">(</span><span class="o">*</span><a href="#Signature"><span class="nx">Signature</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span> | |
| <span class="c1">// Algorithms returns the available algorithms in preference order. The list | |
| </span><span class="c1"></span> <span class="c1">// must not be empty, and it must not include certificate types. | |
| </span><span class="c1"></span> <span id="Signer.Algorithms"><span class="nf">Algorithms</span></span><span class="p">()</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a> | |
| <span class="p">}</span></pre> | |
| <p>A Signer can create signatures that verify against a public key. | |
| <p>Some Signers provided by this package also implement MultiAlgorithmSigner. | |
| <h4 id="NewCertSigner">func NewCertSigner</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">NewCertSigner</span><span class="p">(</span><span class="nx">cert</span> <span class="o">*</span><a href="#Certificate"><span class="nx">Certificate</span></a><span class="p">,</span> <span class="nx">signer</span> <a href="#Signer"><span class="nx">Signer</span></a><span class="p">)</span> <span class="p">(</span><a href="#Signer"><span class="nx">Signer</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>NewCertSigner returns a Signer that signs with the given Certificate, whose | |
| private key is held by signer. It returns an error if the public key in cert | |
| doesn't match the key used by signer. | |
| <h4 id="NewSigner">func NewSigner</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">NewSigner</span><span class="p">(</span><span class="nx">signer</span> <a href="https://pkg.go.dev/crypto"><span class="nx">crypto</span></a><span class="p">.</span><a href="https://pkg.go.dev/crypto#Signer"><span class="nx">Signer</span></a><span class="p">)</span> <span class="p">(</span><a href="#Signer"><span class="nx">Signer</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>NewSigner takes any crypto.Signer implementation and returns a corresponding | |
| Signer interface. This can be used, for example, with keys kept in hardware | |
| modules. | |
| <h4 id="NewSignerWithAlgorithms">func NewSignerWithAlgorithms</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="nf">NewSignerWithAlgorithms</span><span class="p">(</span><span class="nx">signer</span> <a href="#Signer"><span class="nx">Signer</span></a><span class="p">,</span> <span class="nx">algorithms</span> <span class="p">[]</span><a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a><span class="p">)</span> <span class="p">(</span><a href="#Signer"><span class="nx">Signer</span></a><span class="p">,</span> <a href="https://pkg.go.dev/builtin#error"><span class="kt">error</span></a><span class="p">)</span></pre> | |
| <p>NewSignerWithAlgorithms returns a signer restricted to the specified | |
| algorithms. The algorithms must be set in preference order. The list must not | |
| be empty, and it must not include certificate types. An error is returned if | |
| the specified algorithms are incompatible with the public key type. | |
| <h3 id="TerminalModes">type TerminalModes</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">TerminalModes</span> <span class="kd">map</span><span class="p">[</span><a href="https://pkg.go.dev/builtin#uint8"><span class="kt">uint8</span></a><span class="p">]</span><a href="https://pkg.go.dev/builtin#uint32"><span class="kt">uint32</span></a></pre> | |
| <h3 id="Waitmsg">type Waitmsg</h3> | |
| <pre class="chroma"><span class="kd">type</span> <span class="nx">Waitmsg</span> <span class="kd">struct</span> <span class="p">{</span> | |
| <span class="c1">// contains filtered or unexported fields | |
| </span><span class="c1"></span><span class="p">}</span></pre> | |
| <p>Waitmsg stores the information about an exited remote command | |
| as reported by Wait. | |
| <h4 id="Waitmsg.ExitStatus">func (Waitmsg) ExitStatus</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">w</span> <a href="#Waitmsg"><span class="nx">Waitmsg</span></a><span class="p">)</span> <span class="nf">ExitStatus</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#int"><span class="kt">int</span></a></pre> | |
| <p>ExitStatus returns the exit status of the remote command. | |
| <h4 id="Waitmsg.Lang">func (Waitmsg) Lang</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">w</span> <a href="#Waitmsg"><span class="nx">Waitmsg</span></a><span class="p">)</span> <span class="nf">Lang</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>Lang returns the language tag. See RFC 3066 | |
| <h4 id="Waitmsg.Msg">func (Waitmsg) Msg</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">w</span> <a href="#Waitmsg"><span class="nx">Waitmsg</span></a><span class="p">)</span> <span class="nf">Msg</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>Msg returns the exit message given by the remote command | |
| <h4 id="Waitmsg.Signal">func (Waitmsg) Signal</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">w</span> <a href="#Waitmsg"><span class="nx">Waitmsg</span></a><span class="p">)</span> <span class="nf">Signal</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <p>Signal returns the exit signal of the remote command if | |
| it was terminated violently. | |
| <h4 id="Waitmsg.String">func (Waitmsg) String</h4> | |
| <pre class="chroma"><span class="kd">func</span> <span class="p">(</span><span class="nx">w</span> <a href="#Waitmsg"><span class="nx">Waitmsg</span></a><span class="p">)</span> <span class="nf">String</span><span class="p">()</span> <a href="https://pkg.go.dev/builtin#string"><span class="kt">string</span></a></pre> | |
| <h3 id="pkg-directories">Directories</h3> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td><a href="agent/agent.html">agent</a></td> | |
| <td>Package agent implements the ssh-agent protocol, and provides both a client and a server.</td> | |
| </tr> | |
| <tr> | |
| <td><a href="knownhosts/knownhosts.html">knownhosts</a></td> | |
| <td>Package knownhosts implements a parser for the OpenSSH known_hosts host key database, and provides utility functions for writing OpenSSH compliant known_hosts files.</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </main> | |
| <hr> | |
| <footer> | |
| <small id="generated-by-footer"> | |
| Generated with <a href="https://abhinav.github.io/doc2go/">doc2go</a> | |
| </small> | |
| </footer> | |
| <script type="text/javascript"> | |
| // If the page was opened with an anchor (e.g. #foo), | |
| // and the destination is a <details> element, open it. | |
| function openDetailsAnchor() { | |
| let hash = window.location.hash | |
| if (!hash) { | |
| return | |
| } | |
| let el = document.getElementById(hash.slice(1)) // remove leading '#' | |
| if (!el) { | |
| return | |
| } | |
| let details = el.closest("details") | |
| while (details) { | |
| details.open = true | |
| details = details.parentElement.closest("details") | |
| } | |
| // New elements may have appeared. | |
| // Set hash again to scroll to the right place. | |
| window.location.hash = hash; | |
| return false; | |
| } | |
| window.addEventListener('hashchange', openDetailsAnchor) | |
| window.addEventListener('load', () => { | |
| document.querySelectorAll("h2, h3, h4, h5, h6").forEach((el) => { | |
| if (!el.id) { | |
| return | |
| } | |
| el.innerHTML += ' <a class="permalink" href="#' + el.id + '">¶</a>' | |
| }) | |
| document.querySelectorAll("details.example > summary").forEach((el) => { | |
| let id = el.parentElement.id; | |
| if (!id) { | |
| return | |
| } | |
| el.innerHTML += ' <a class="permalink" href="#' + id + '">¶</a>' | |
| }) | |
| openDetailsAnchor() | |
| }) | |
| </script> | |
| </body> | |
| </html> |