【发布时间】:2019-07-30 11:41:53
【问题描述】:
当我使用session.Shell() 在远程服务器上启动一个新的 shell,然后使用session.Wait() 运行会话直到远程端退出会话时,使用 Ctrl+D 结束会话时无法正常处理。
我可以使用 os/exec 启动本地子进程来运行本地可用的任何 ssh 客户端副本,但我更喜欢使用本机 Go 来完成这项工作。
示例代码sn-p:
conn, err := ssh.Dial("tcp", "some-server.fqdn", sshConfig)
if err != nil {
return err
}
defer conn.Close()
session, err := conn.NewSession()
if err != nil {
return err
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
modes := ssh.TerminalModes{
ssh.ECHO: 0,
ssh.TTY_OP_ISPEED: 14400,
ssh.TTY_OP_OSPEED: 14400,
}
err = session.RequestPty("xterm", 80, 40, modes)
if err != nil {
return err
}
err = session.Shell()
if err != nil {
return err
}
session.Wait()
在远程服务器上运行exit 优雅地挂起远程端,session.Wait() 按预期返回,但发送带有 Ctrl+D 的 EOF 会导致远程端挂起,但对 session.Wait() 的调用被阻塞.我必须使用 Ctrl+C 对 Go 程序进行 SIGINT。
我想让两者都优雅地退出 session.Wait() 调用,因为这是大多数交互式 ssh 会话的预期行为。
【问题讨论】: