mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-11 21:27:31 +00:00
.bencher
.github
appc
atomicfile
chirp
client
clientupdate
cmd
control
derp
disco
docs
doctor
drive
envknob
feature
gokrazy
health
hostinfo
internal
ipn
jsondb
k8s-operator
kube
licenses
log
logpolicy
logtail
metrics
net
omit
packages
paths
portlist
posture
prober
proxymap
release
safesocket
safeweb
scripts
sessionrecording
smallzstd
ssh
syncs
tailcfg
taildrop
tempfork
acme
gliderlabs
ssh
LICENSE
README.md
agent.go
conn.go
context.go
context_test.go
doc.go
example_test.go
options.go
options_test.go
server.go
server_test.go
session.go
session_test.go
ssh.go
ssh_test.go
tcpip.go
tcpip_test.go
util.go
wrap.go
heap
httprec
spf13
tka
tool
tsconst
tsd
tsnet
tstest
tstime
tsweb
types
util
version
wf
wgengine
words
.gitattributes
.gitignore
.golangci.yml
ALPINE.txt
AUTHORS
CODEOWNERS
CODE_OF_CONDUCT.md
Dockerfile
Dockerfile.base
LICENSE
Makefile
PATENTS
README.md
SECURITY.md
VERSION.txt
api.md
assert_ts_toolchain_match.go
build_dist.sh
build_docker.sh
flake.lock
flake.nix
go.mod
go.mod.sri
go.sum
go.toolchain.branch
go.toolchain.rev
gomod_test.go
header.txt
pkgdoc_test.go
pull-toolchain.sh
shell.nix
staticcheck.conf
update-flake.sh
version-embed.go
version_tailscale_test.go
version_test.go

Updates #5210 Change-Id: Ib02cd5e43d0a8db60c1f09755a8ac7b140b670be Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
46 lines
1.7 KiB
Go
46 lines
1.7 KiB
Go
/*
|
|
Package ssh wraps the crypto/ssh package with a higher-level API for building
|
|
SSH servers. The goal of the API was to make it as simple as using net/http, so
|
|
the API is very similar.
|
|
|
|
You should be able to build any SSH server using only this package, which wraps
|
|
relevant types and some functions from crypto/ssh. However, you still need to
|
|
use crypto/ssh for building SSH clients.
|
|
|
|
ListenAndServe starts an SSH server with a given address, handler, and options. The
|
|
handler is usually nil, which means to use DefaultHandler. Handle sets DefaultHandler:
|
|
|
|
ssh.Handle(func(s ssh.Session) {
|
|
io.WriteString(s, "Hello world\n")
|
|
})
|
|
|
|
log.Fatal(ssh.ListenAndServe(":2222", nil))
|
|
|
|
If you don't specify a host key, it will generate one every time. This is convenient
|
|
except you'll have to deal with clients being confused that the host key is different.
|
|
It's a better idea to generate or point to an existing key on your system:
|
|
|
|
log.Fatal(ssh.ListenAndServe(":2222", nil, ssh.HostKeyFile("/Users/progrium/.ssh/id_rsa")))
|
|
|
|
Although all options have functional option helpers, another way to control the
|
|
server's behavior is by creating a custom Server:
|
|
|
|
s := &ssh.Server{
|
|
Addr: ":2222",
|
|
Handler: sessionHandler,
|
|
PublicKeyHandler: authHandler,
|
|
}
|
|
s.AddHostKey(hostKeySigner)
|
|
|
|
log.Fatal(s.ListenAndServe())
|
|
|
|
This package automatically handles basic SSH requests like setting environment
|
|
variables, requesting PTY, and changing window size. These requests are
|
|
processed, responded to, and any relevant state is updated. This state is then
|
|
exposed to you via the Session interface.
|
|
|
|
The one big feature missing from the Session abstraction is signals. This was
|
|
started, but not completed. Pull Requests welcome!
|
|
*/
|
|
package ssh
|