【问题标题】:Golang ssh interrupt signalGolang ssh 中断信号
【发布时间】:2020-04-24 11:51:20
【问题描述】:

我正在开发一个简单的 ssh 客户端,它连接到多个远程主机并允许读取日志文件。我设法连接到我的远程计算机并在我的远程计算机上运行命令

stdin, err := session.StdinPipe()

if err != nil {
    log.Fatalf("Failed to establish stdin pipe: %v", err)
}

session.Stdout = os.Stdout
session.Stderr = os.Stderr

err = session.Shell()

if err != nil {
    log.Fatal(err)
}

reader := bufio.NewReader(os.Stdin)
for {
    text, _ := reader.ReadString('\n')

    if text == "exit\n" {
        break
    }

    if text == "br\n" {
        // ??? HOW ???
        continue
    }

    _, err = fmt.Fprintf(stdin, "%s", text)

    if err != nil {
        log.Fatal(err)
    }
}

当我运行tail -f access.tskv 时,我会在标准输入上得到输出。我的问题是我不知道如何向远程机器上的 shell 发送中断信号。

有什么想法吗?

【问题讨论】:

  • 这能回答你的问题吗? How to send control+c from a bash script?
  • @Dexygen 一点也没有
  • 好吧,也许这不是一个密切的原因,但肯定有足够的线索:获取你正在运行的 shell 进程的 PID,然后 KILL 它。也许修改您的一般方法,以便可以这样做?
  • @Dexygen 我的远程主机正在执行前台任务,即“tail -f nginx.og”。您如何建议我执行另一个 bash 命令,例如 ps aux 而无需先向 tail 发送 SIGINT?
  • 它可能看起来有点乱,但我想你以后总是可以打开另一个 shell,只是为了获取 PID。

标签: go ssh


【解决方案1】:

session.Signal(ssh.SIGINT) 应该根据 API 文档来解决问题。但由于某种原因,另一端没有触发信号。似乎问题出在 ubuntu 18.04 上的 sshd

https://github.com/golang/go/issues/16597#issuecomment-548053530

【讨论】:

    【解决方案2】:

    为了向进程发送信号(假设您的远程主机是基于 Unix 的),我们需要使用以下命令找到我们希望向其发送信号的进程的进程 ID:

    ps aux | grep '[process-name]'
    

    参考:https://www.cyberciti.biz/faq/linux-find-process-name/

    找到进程及其 ID(通常是整数)后,您可以运行以下命令向其发送信号

    kill -SIGINT [PID]
    

    参考:https://bash.cyberciti.biz/guide/Sending_signal_to_Processes

    希望这会有所帮助!

    【讨论】:

    • 这与我的问题甚至不接近
    • 感谢您的评论,我想我无法真正理解您在这里要做什么。也许进一步澄清您正在逐步尝试做的事情可以描绘出更好的画面,甚至只是您想要实现的用例。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2013-08-09
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多