mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-26 03:25:35 +00:00
client/tailscale, cmd/tailscale, localapi: add 'tailscale nc' (actually)
Adds missing file from fc12cbfcd3
.
GitHub was having issues earlier and it was all green because the
checks never actually ran, but the DCO non-Actions check at least did,
so "green" and I merged, not realizing it hadn't really run anything.
Updates #3802
Change-Id: I29f605eebe5336f1f3ca28ebb78b092dd99d9fd8
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
fc12cbfcd3
commit
5df12b9059
63
cmd/tailscale/cli/nc.go
Normal file
63
cmd/tailscale/cli/nc.go
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/peterbourgon/ff/v3/ffcli"
|
||||||
|
"tailscale.com/client/tailscale"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ncCmd = &ffcli.Command{
|
||||||
|
Name: "nc",
|
||||||
|
ShortUsage: "nc <hostname-or-IP> <port>",
|
||||||
|
ShortHelp: "Connect to a port on a host, connected to stdin/stdout",
|
||||||
|
Exec: runNC,
|
||||||
|
}
|
||||||
|
|
||||||
|
func runNC(ctx context.Context, args []string) error {
|
||||||
|
st, err := tailscale.Status(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return fixTailscaledConnectError(err)
|
||||||
|
}
|
||||||
|
description, ok := isRunningOrStarting(st)
|
||||||
|
if !ok {
|
||||||
|
printf("%s\n", description)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) != 2 {
|
||||||
|
return errors.New("usage: nc <hostname-or-IP> <port>")
|
||||||
|
}
|
||||||
|
|
||||||
|
hostOrIP, portStr := args[0], args[1]
|
||||||
|
port, err := strconv.ParseUint(portStr, 10, 16)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("invalid port number %q", portStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(bradfitz): also add UDP too, via flag?
|
||||||
|
c, err := tailscale.DialTCP(ctx, hostOrIP, uint16(port))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Dial(%q, %v): %w", hostOrIP, port, err)
|
||||||
|
}
|
||||||
|
defer c.Close()
|
||||||
|
errc := make(chan error, 1)
|
||||||
|
go func() {
|
||||||
|
_, err := io.Copy(os.Stdout, c)
|
||||||
|
errc <- err
|
||||||
|
}()
|
||||||
|
go func() {
|
||||||
|
_, err := io.Copy(c, os.Stdin)
|
||||||
|
errc <- err
|
||||||
|
}()
|
||||||
|
return <-errc
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user