( user string, address string, authMethodBuilder sshAuthMethodBuilder)
| 380 | } |
| 381 | |
| 382 | func (d *sshClient) remote( |
| 383 | user string, address string, authMethodBuilder sshAuthMethodBuilder) { |
| 384 | defer func() { |
| 385 | d.w.Signal(command.HeaderClose) |
| 386 | |
| 387 | close(d.remoteConnReceive) |
| 388 | d.remoteCloseWait.Done() |
| 389 | }() |
| 390 | |
| 391 | buf := [4096]byte{} |
| 392 | |
| 393 | conn, clearConnInitialDeadline, dErr := |
| 394 | d.dialRemote("tcp", address, &ssh.ClientConfig{ |
| 395 | User: user, |
| 396 | Auth: authMethodBuilder(buf[:]), |
| 397 | HostKeyCallback: func(h string, r net.Addr, k ssh.PublicKey) error { |
| 398 | return d.comfirmRemoteFingerprint(h, r, k, buf[:]) |
| 399 | }, |
| 400 | Timeout: d.cfg.DialTimeout, |
| 401 | }) |
| 402 | |
| 403 | if dErr != nil { |
| 404 | errLen := copy(buf[d.w.HeaderSize():], dErr.Error()) + d.w.HeaderSize() |
| 405 | d.w.SendManual(SSHServerConnectFailed, buf[:errLen]) |
| 406 | |
| 407 | d.l.Debug("Unable to connect to remote machine: %s", dErr) |
| 408 | |
| 409 | return |
| 410 | } |
| 411 | |
| 412 | defer conn.Close() |
| 413 | |
| 414 | session, sErr := conn.NewSession() |
| 415 | |
| 416 | if sErr != nil { |
| 417 | errLen := copy(buf[d.w.HeaderSize():], sErr.Error()) + d.w.HeaderSize() |
| 418 | d.w.SendManual(SSHServerConnectFailed, buf[:errLen]) |
| 419 | |
| 420 | d.l.Debug("Unable open new session on remote machine: %s", sErr) |
| 421 | |
| 422 | return |
| 423 | } |
| 424 | |
| 425 | defer session.Close() |
| 426 | |
| 427 | in, inErr := session.StdinPipe() |
| 428 | |
| 429 | if inErr != nil { |
| 430 | errLen := copy(buf[d.w.HeaderSize():], inErr.Error()) + d.w.HeaderSize() |
| 431 | d.w.SendManual(SSHServerConnectFailed, buf[:errLen]) |
| 432 | |
| 433 | d.l.Debug("Unable export Stdin pipe: %s", inErr) |
| 434 | |
| 435 | return |
| 436 | } |
| 437 | |
| 438 | out, outErr := session.StdoutPipe() |
| 439 |
no test coverage detected