github.com/pkg/sftp@v1.13.6/examples/streaming-read-benchmark/main.go (about) 1 // streaming-read-benchmark benchmarks the peformance of reading 2 // from /dev/zero on the server to /dev/null on the client via io.Copy. 3 package main 4 5 import ( 6 "flag" 7 "fmt" 8 "io" 9 "log" 10 "net" 11 "os" 12 "syscall" 13 "time" 14 15 "golang.org/x/crypto/ssh" 16 "golang.org/x/crypto/ssh/agent" 17 18 "github.com/pkg/sftp" 19 ) 20 21 var ( 22 USER = flag.String("user", os.Getenv("USER"), "ssh username") 23 HOST = flag.String("host", "localhost", "ssh server hostname") 24 PORT = flag.Int("port", 22, "ssh server port") 25 PASS = flag.String("pass", os.Getenv("SOCKSIE_SSH_PASSWORD"), "ssh password") 26 SIZE = flag.Int("s", 1<<15, "set max packet size") 27 ) 28 29 func init() { 30 flag.Parse() 31 } 32 33 func main() { 34 var auths []ssh.AuthMethod 35 if aconn, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK")); err == nil { 36 auths = append(auths, ssh.PublicKeysCallback(agent.NewClient(aconn).Signers)) 37 38 } 39 if *PASS != "" { 40 auths = append(auths, ssh.Password(*PASS)) 41 } 42 43 config := ssh.ClientConfig{ 44 User: *USER, 45 Auth: auths, 46 HostKeyCallback: ssh.InsecureIgnoreHostKey(), 47 } 48 addr := fmt.Sprintf("%s:%d", *HOST, *PORT) 49 conn, err := ssh.Dial("tcp", addr, &config) 50 if err != nil { 51 log.Fatalf("unable to connect to [%s]: %v", addr, err) 52 } 53 defer conn.Close() 54 55 c, err := sftp.NewClient(conn, sftp.MaxPacket(*SIZE)) 56 if err != nil { 57 log.Fatalf("unable to start sftp subsytem: %v", err) 58 } 59 defer c.Close() 60 61 r, err := c.Open("/dev/zero") 62 if err != nil { 63 log.Fatal(err) 64 } 65 defer r.Close() 66 67 w, err := os.OpenFile("/dev/null", syscall.O_WRONLY, 0600) 68 if err != nil { 69 log.Fatal(err) 70 } 71 defer w.Close() 72 73 const size int64 = 1e9 74 75 log.Printf("reading %v bytes", size) 76 t1 := time.Now() 77 n, err := io.Copy(w, io.LimitReader(r, size)) 78 if err != nil { 79 log.Fatal(err) 80 } 81 if n != size { 82 log.Fatalf("copy: expected %v bytes, got %d", size, n) 83 } 84 log.Printf("read %v bytes in %s", size, time.Since(t1)) 85 }