Documentation
¶
Overview ¶
Package sshtunnel helps create a SSH tunnels between clients.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Tunnel ¶
type Tunnel struct {
// contains filtered or unexported fields
}
Tunnel to create SSH port forwarding between hosts.
func NewTunnel ¶
NewTunnel sets up SSH port forwarding so that commands sent to the remote address (remoteAddr) on client "c" are forwarded to the local address (localAddr).
It returns a new Tunnel that can be closed after use.
Example ¶
const (
remoteAddr = "127.0.0.1:0"
remoteHostAddr = "remoteHostname:22"
)
// In this example, we set up an HTTP server on the local machine and
// expose it to a remote device via ssh tunnel, so on the remote device,
// we can access the http service on "localhost:<OS assigned port>".
s := http.Server{}
http.HandleFunc("/foo", func(w http.ResponseWriter, _ *http.Request) {
fmt.Fprint(w, "Hello World!\n")
})
// Use port "0" to request the OS to assign an unused port number.
ln, err := net.Listen("tcp", ":0")
if err != nil {
panic(fmt.Sprintf("Error starting the listener: %s", err))
}
defer ln.Close()
go s.Serve(ln)
defer s.Shutdown(context.Background())
// Get the listener's address.
localAddr := ln.Addr().String()
// Create the SSH client.
client, err := ssh.Dial("tcp", remoteHostAddr, &ssh.ClientConfig{})
if err != nil {
panic(fmt.Sprintf("Error connecting to %s: %s", client.RemoteAddr().String(), err))
}
defer client.Close()
// Create the SSH tunnel.
t, err := NewTunnel(localAddr, remoteAddr, client)
if err != nil {
panic(fmt.Sprintf("Error setting up SSH tunnel: %s", err))
}
defer t.Close()
// Get address of the listener on the client.
lnAddr := t.RemoteAddr().String()
// Send commands over the created tunnel.
cs, err := client.NewSession()
if err != nil {
panic(fmt.Sprintf("Error staring new session on %s: %s", remoteHostAddr, err))
}
defer cs.Close()
err = cs.Run(fmt.Sprintf("curl %s/foo", lnAddr))
if err != nil {
panic(fmt.Sprintf("Error running 'curl %s/foo' on %s: %s", lnAddr, remoteHostAddr, err))
}
func (*Tunnel) Close ¶
func (t *Tunnel) Close()
Close closes the tunnel including all resources, and ongoing connections.
func (*Tunnel) IsAlive ¶
IsAlive checks if the Tunnel is alive. If the tunnel is in the process of shutting down but not fully shut down, this method will return false.
func (*Tunnel) RemoteAddr ¶
RemoteAddr returns the address and port on which the service is running on the remote device.