当前位置: 首页 > 工具软件 > gossh > 使用案例 >

gossh

上官锦
2023-12-01
package main

import (
	"flag"
	"io"
	"log"
	"net"
	"os"
	"os/exec"
	"golang.org/x/crypto/ssh/terminal"
	"github.com/kr/pty"
)

var (
	addr     = flag.String("addr", ":8080", "address")
	isserver = flag.Bool("s", false, "run as server")
)

func handle(conn net.Conn) {
	defer conn.Close()
	log.Printf("[login] %s", conn.RemoteAddr())
	cmd := exec.Command("/bin/bash")
	tty, err := pty.Start(cmd)
	if err != nil {
		log.Print(err)
		return
	}
	go io.Copy(tty, conn)
	go io.Copy(conn, tty)
	cmd.Wait()
	log.Printf("[logout] %s", conn.RemoteAddr())
}

func server() {
	l, err := net.Listen("tcp", *addr)
	if err != nil {
		log.Fatal(err)
	}
	for {
		conn, err := l.Accept()
		if err != nil {
			log.Fatal(err)
		}
		go handle(conn)
	}
}

func client() {
	conn, err := net.Dial("tcp", *addr)
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	oldState, err := terminal.MakeRaw(0)
	if err != nil {
		panic(err)
	}
	defer terminal.Restore(0, oldState)
	go io.Copy(conn, os.Stdin)
	io.Copy(os.Stdout, conn)
}

func main() {
	flag.Parse()

	if *isserver {
		server()
		return
	}
	client()
}

服务端:

gossh -addr=:8080 -s

客户端: gossh -addr=:8080

或者: nc 127.0.0.1 8080

相关阅读

相关文章

相关问答

相关文档