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")