@@ -63,12 +63,12 @@ func (c *Client) log(err error) {
6363 }
6464 c .Logger (nil , err )
6565}
66- func (c * Client ) Open (r * bufio.Reader , version string ) (err error ) {
66+ func (c * Client ) Open (r * bufio.Reader , version string , id string ) (err error ) {
6767 defer err2 .Handle (& err , func () {
6868 c .log (fmt .Errorf ("bash client start failed: %w" , err ))
6969 })
7070 To (c .parseArgs (r , version ))
71- To (c .initServerAddr ())
71+ To (c .initServerAddr (r , id ))
7272 To (c .initID (r ))
7373 To (c .initPWD (r ))
7474 go c .tasks .Start ()
@@ -108,12 +108,27 @@ func (c *Client) parseArgs(r *bufio.Reader, version string) (err error) {
108108 return
109109}
110110
111- func (c * Client ) initServerAddr () (err error ) {
111+ func (c * Client ) initServerAddr (r * bufio. Reader , id string ) (err error ) {
112112 defer err2 .Handle (& err , func () {
113- err = ErrServerAddrParseFailed
113+ if errors .Is (err , ErrNeedPrint ) {
114+ return
115+ }
116+ err = ErrServerAddrIncorrect
114117 })
115- addr := To1 (net .ResolveTCPAddr ("tcp" , c .ServerAddr ))
118+ addr , err := net .ResolveTCPAddr ("tcp" , c .ServerAddr )
119+ if err != nil {
120+ return ErrServerAddrParseFailed
121+ }
116122 c .ServerAddr = fmt .Sprintf ("%s/%d" , addr .IP .String (), addr .Port )
123+
124+ tcp := fmt .Sprintf ("4>&0 5>/dev/tcp/%s 3> >(>&5 dd bs=1 <&4) dd bs=1 <&5" , c .ServerAddr )
125+ cmd := fmt .Sprintf ("echo -1 | %s || echo /dev/null\n " , tcp )
126+ To1 (io .WriteString (c .conn , cmd ))
127+ line , _ := To2 (r .ReadLine ())
128+ if string (line ) != id {
129+ err = ErrServerAddrIncorrect
130+ return
131+ }
117132 return
118133}
119134
0 commit comments