First agent version, passing in external listener fo ssh so it can be used later with yamux as well.
This commit is contained in:
		
							parent
							
								
									3b2b9162ba
								
							
						
					
					
						commit
						f3cbd9012a
					
				
							
								
								
									
										102
									
								
								cmd/agent/agent.go
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										102
									
								
								cmd/agent/agent.go
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,102 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"log" | ||||||
|  | 	"net" | ||||||
|  | 	"os" | ||||||
|  | 	"os/exec" | ||||||
|  | 	"syscall" | ||||||
|  | 	"unsafe" | ||||||
|  | 
 | ||||||
|  | 	"github.com/creack/pty" | ||||||
|  | 	"github.com/gliderlabs/ssh" | ||||||
|  | 	"github.com/pkg/sftp" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func SftpHandler(sess ssh.Session) { | ||||||
|  | 	debugStream := io.Discard | ||||||
|  | 	serverOptions := []sftp.ServerOption{ | ||||||
|  | 		sftp.WithDebug(debugStream), | ||||||
|  | 	} | ||||||
|  | 	server, err := sftp.NewServer( | ||||||
|  | 		sess, | ||||||
|  | 		serverOptions..., | ||||||
|  | 	) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Printf("sftp tcpserver init error: %s\n", err) | ||||||
|  | 		return | ||||||
|  | 	}F | ||||||
|  | 	if err := server.Serve(); err == io.EOF { | ||||||
|  | 		server.Close() | ||||||
|  | 		fmt.Println("sftp client exited session.") | ||||||
|  | 	} else if err != nil { | ||||||
|  | 		fmt.Println("sftp tcpserver completed with error:", err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func passwordAuth(ctx ssh.Context, password string) bool { | ||||||
|  | 	// Replace with your own logic to validate username and password
 | ||||||
|  | 	return ctx.User() == "abc" && password == "123" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func setWinsize(f *os.File, w, h int) { | ||||||
|  | 	syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), uintptr(syscall.TIOCSWINSZ), | ||||||
|  | 		uintptr(unsafe.Pointer(&struct{ h, w, x, y uint16 }{uint16(h), uint16(w), 0, 0}))) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	ssh.Handle(func(s ssh.Session) { | ||||||
|  | 		cmd := exec.Command("bash") | ||||||
|  | 		ptyReq, winCh, isPty := s.Pty() | ||||||
|  | 		if isPty { | ||||||
|  | 			cmd.Env = append(os.Environ(), fmt.Sprintf("TERM=%s", ptyReq.Term)) | ||||||
|  | 			f, err := pty.Start(cmd) | ||||||
|  | 			if err != nil { | ||||||
|  | 				panic(err) | ||||||
|  | 			} | ||||||
|  | 			go func() { | ||||||
|  | 				for win := range winCh { | ||||||
|  | 					setWinsize(f, win.Width, win.Height) | ||||||
|  | 				} | ||||||
|  | 			}() | ||||||
|  | 			go func() { | ||||||
|  | 				io.Copy(f, s) // stdin
 | ||||||
|  | 			}() | ||||||
|  | 			io.Copy(s, f) // stdout
 | ||||||
|  | 			cmd.Wait() | ||||||
|  | 		} else { | ||||||
|  | 			io.WriteString(s, "No PTY requested.\n") | ||||||
|  | 			s.Exit(1) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	log.Println("starting ssh tcpserver on port 2222...") | ||||||
|  | 	server := ssh.Server{ | ||||||
|  | 		Addr:            ":2222", | ||||||
|  | 		PasswordHandler: passwordAuth, | ||||||
|  | 		SubsystemHandlers: map[string]ssh.SubsystemHandler{ | ||||||
|  | 			"sftp": SftpHandler, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	listener, err := net.Listen("tcp", ":2222") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	server.Serve(listener) | ||||||
|  | 
 | ||||||
|  | 	//for {
 | ||||||
|  | 	//	conn, err := listener.Accept()
 | ||||||
|  | 	//	if err != nil {
 | ||||||
|  | 	//		log.Println("Failed to accept connection:", err)
 | ||||||
|  | 	//		continue
 | ||||||
|  | 	//	}
 | ||||||
|  | 	//	log.Println("Got connection")
 | ||||||
|  | 	//	go server.HandleConn(conn)
 | ||||||
|  | 	//}
 | ||||||
|  | 
 | ||||||
|  | 	//log.Fatal(server.ListenAndServe())
 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user