gitee.com/h79/goutils@v1.22.10/common/ssh/handler.go (about)

     1  package ssh
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  )
     9  
    10  type Sender struct {
    11  	w    io.WriteCloser
    12  	info FileInfo
    13  }
    14  
    15  func (wf *Sender) Do(reply io.Reader, src io.Reader) (err error) {
    16  	if err = wf.writeHead(); err != nil {
    17  		return
    18  	}
    19  	if err = readReply(reply); err != nil {
    20  		return
    21  	}
    22  
    23  	if err = wf.writeFile(src); err != nil {
    24  		return
    25  	}
    26  
    27  	if err = wf.writeCompleted(); err != nil {
    28  		return
    29  	}
    30  	err = readReply(reply)
    31  	return
    32  }
    33  
    34  func (wf *Sender) writeHead() error {
    35  	_, err := fmt.Fprintf(wf.w, "C%#4o %d %s\n", wf.info.Mode&os.ModePerm, wf.info.Size, wf.info.Name)
    36  	return err
    37  }
    38  
    39  func (wf *Sender) writeFile(src io.Reader) error {
    40  	_, err := io.Copy(wf.w, src)
    41  	return err
    42  }
    43  
    44  func (wf *Sender) writeCompleted() error {
    45  	_, err := fmt.Fprint(wf.w, "\x00")
    46  	return err
    47  }
    48  
    49  type Receiver struct {
    50  	opt *Option
    51  }
    52  
    53  func (rf *Receiver) Do(reply io.Reader, ack io.Writer) (err error) {
    54  	var Ack = func(w io.Writer) error {
    55  		var msg = []byte{0}
    56  		n, err2 := w.Write(msg)
    57  		if err2 != nil {
    58  			return err2
    59  		}
    60  		if n < len(msg) {
    61  			return ErrAck
    62  		}
    63  		return nil
    64  	}
    65  
    66  	if err = Ack(ack); err != nil {
    67  		return
    68  	}
    69  
    70  	res, err := ParseReply(reply)
    71  	if err != nil {
    72  		return
    73  	}
    74  
    75  	if res.IsFailure() {
    76  		return res
    77  	}
    78  
    79  	info, err := res.Parse()
    80  	if err != nil {
    81  		return
    82  	}
    83  
    84  	if err = Ack(ack); err != nil {
    85  		return
    86  	}
    87  
    88  	if fi, ok := info.(*FileHeader); ok {
    89  		//文件传输
    90  		if err = fi.Receive(rf.opt, reply); err != nil {
    91  			return
    92  		}
    93  	}
    94  	if _, ok := info.(*DirHeader); ok {
    95  		//目录传输
    96  	}
    97  	err = Ack(ack)
    98  	return
    99  }
   100  
   101  //
   102  //// ReceiveFromByWriter 下载
   103  //func (scp *Scp) ReceiveFromByWriter(dst io.Writer, opt *Option) error {
   104  
   105  var ErrAck = errors.New("failed to write ack buffer")
   106  var ErrCopy = errors.New("failed to copy file")