func NewClient(conn *ssh.Client, readLimitBytesPerSecond, writeLimitBytesPerSecond int64, opts ...func(*sftp.Client) error) (*sftp.Client, error) { s, err := conn.NewSession() if err != nil { return nil, err } if err := s.RequestSubsystem("sftp"); err != nil { return nil, err } pw, err := s.StdinPipe() if err != nil { return nil, err } pr, err := s.StdoutPipe() if err != nil { return nil, err } if readLimitBytesPerSecond > 0 { pr = flowrate.NewReader(pr, readLimitBytesPerSecond) } if writeLimitBytesPerSecond > 0 { pw = flowrate.NewWriter(pw, writeLimitBytesPerSecond) } return sftp.NewClientPipe(pr, pw, opts...) }
func startClient(program string, args ...string) (*SFTP, error) { // Connect to a remote host and request the sftp subsystem via the 'ssh' // command. This assumes that passwordless login is correctly configured. cmd := exec.Command(program, args...) // send errors from ssh to stderr cmd.Stderr = os.Stderr // ignore signals sent to the parent (e.g. SIGINT) cmd.SysProcAttr = ignoreSigIntProcAttr() // get stdin and stdout wr, err := cmd.StdinPipe() if err != nil { log.Fatal(err) } rd, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } // start the process if err := cmd.Start(); err != nil { log.Fatal(err) } // open the SFTP session client, err := sftp.NewClientPipe(rd, wr) if err != nil { log.Fatal(err) } return &SFTP{c: client, cmd: cmd}, nil }
func (p *SSHPath) newClient() (*sftp.Client, error) { if !p.sudo { sftpClient, err := sftp.NewClient(p.client) if err != nil { return nil, fmt.Errorf("error creating sftp client: %v", err) } return sftpClient, nil } else { s, err := p.client.NewSession() if err != nil { return nil, fmt.Errorf("error creating sftp client (in new-session): %v", err) } //if err := s.R("sftp"); err != nil { // return nil, fmt.Errorf("error creating sftp client (in new-session): %v", err) //} stdin, err := s.StdinPipe() if err != nil { return nil, fmt.Errorf("error creating sftp client (at stdin pipe): %v", err) } stdout, err := s.StdoutPipe() if err != nil { return nil, fmt.Errorf("error creating sftp client (at stdout pipe): %v", err) } err = s.Start("sudo /usr/lib/openssh/sftp-server") if err != nil { return nil, fmt.Errorf("error creating sftp client (executing 'sudo /usr/lib/openssh/sftp-server'): %v", err) } return sftp.NewClientPipe(stdout, stdin) } }
func startClient(program string, args ...string) (*SFTP, error) { // Connect to a remote host and request the sftp subsystem via the 'ssh' // command. This assumes that passwordless login is correctly configured. cmd := exec.Command(program, args...) // prefix the errors with the program name stderr, err := cmd.StderrPipe() if err != nil { return nil, errors.Wrap(err, "cmd.StderrPipe") } go func() { sc := bufio.NewScanner(stderr) for sc.Scan() { fmt.Fprintf(os.Stderr, "subprocess %v: %v\n", program, sc.Text()) } }() // ignore signals sent to the parent (e.g. SIGINT) cmd.SysProcAttr = ignoreSigIntProcAttr() // get stdin and stdout wr, err := cmd.StdinPipe() if err != nil { return nil, errors.Wrap(err, "cmd.StdinPipe") } rd, err := cmd.StdoutPipe() if err != nil { return nil, errors.Wrap(err, "cmd.StdoutPipe") } // start the process if err := cmd.Start(); err != nil { return nil, errors.Wrap(err, "cmd.Start") } // wait in a different goroutine ch := make(chan error, 1) go func() { err := cmd.Wait() debug.Log("ssh command exited, err %v", err) ch <- errors.Wrap(err, "cmd.Wait") }() // open the SFTP session client, err := sftp.NewClientPipe(rd, wr) if err != nil { return nil, errors.Errorf("unable to start the sftp session, error: %v", err) } return &SFTP{c: client, cmd: cmd, result: ch}, nil }
func ExampleNewClientPipe() { // Connect to a remote host and request the sftp subsystem via the 'ssh' // command. This assumes that passwordless login is correctly configured. cmd := exec.Command("ssh", "example.com", "-s", "sftp") // send errors from ssh to stderr cmd.Stderr = os.Stderr // get stdin and stdout wr, err := cmd.StdinPipe() if err != nil { log.Fatal(err) } rd, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } // start the process if err := cmd.Start(); err != nil { log.Fatal(err) } defer cmd.Wait() // open the SFTP session client, err := sftp.NewClientPipe(rd, wr) if err != nil { log.Fatal(err) } // read a directory list, err := client.ReadDir("/") if err != nil { log.Fatal(err) } // print contents for _, item := range list { fmt.Println(item.Name()) } // close the connection client.Close() }
func (c *comm) newSftpClient() (*sftp.Client, error) { session, err := c.newSession() if err != nil { return nil, err } if err := session.RequestSubsystem("sftp"); err != nil { return nil, err } pw, err := session.StdinPipe() if err != nil { return nil, err } pr, err := session.StdoutPipe() if err != nil { return nil, err } return sftp.NewClientPipe(pr, pw) }