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  }