Golang Go语言中 SSH 怎么发送本地的信号到远端

发布于 1周前 作者 ionicwang 来自 Go语言
func main() {
client, err := ssh.Dial("tcp", "ip:22", config)
if err != nil {
	panic(err)
}
defer client.Close()

session, err := client.NewSession()
if err != nil {
	panic(err)
}
defer session.Close()


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

session.RequestPty("xterm", h, w, ssh.TerminalModes{
	ssh.ECHO:          0,
	ssh.TTY_OP_ISPEED: 14400,
	ssh.TTY_OP_OSPEED: 14400,
	ssh.IXANY:         1,
	ssh.IMAXBEL:       1,
})

session.Shell()

session.Wait()

}

连接正常。但是打开 htop q 没反应,pageup/down 没反应。ctrl-c 直接主进程退了。


Golang Go语言中 SSH 怎么发送本地的信号到远端

更多关于Golang Go语言中 SSH 怎么发送本地的信号到远端的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

关键词 tty raw mode

更多关于Golang Go语言中 SSH 怎么发送本地的信号到远端的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的。以前写的相关的玩意:

<br> if (tcgetattr(1, &amp;t) != 0) {<br> perror("tcgetattr");<br> goto out;<br> }<br> t.c_lflag &amp;= ~(ICANON | ISIG | IEXTEN | ECHO);<br> t.c_iflag &amp;= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR | INPCK | ISTRIP | IXON | PARMRK);<br> t.c_oflag &amp;= ~OPOST;<br> t.c_cc[VMIN] = 1;<br> t.c_cc[VTIME] = 0;<br> if (tcsetattr(1, TCSAFLUSH, &amp;t) != 0) {<br> perror("tcsetattr");<br> goto out;<br> }<br>

在Go语言中,通过SSH发送本地信号到远端通常涉及使用golang.org/x/crypto/ssh包来建立SSH连接并执行远程命令。虽然SSH协议本身不直接支持发送操作系统信号(如SIGINT, SIGTERM等),但你可以通过一些变通方法来实现类似功能。

一种常见的方法是,在远程服务器上运行一个可以接收特定输入(如特定字符串)并据此触发相应操作的脚本或程序。然后,通过SSH连接发送这个特定输入到该脚本。

以下是一个基本示例,展示如何通过SSH在远程服务器上执行命令:

package main

import (
    "golang.org/x/crypto/ssh"
    "io"
    "log"
    "os"
)

func main() {
    // 配置SSH连接信息
    config := &ssh.ClientConfig{
        User: "username",
        Auth: []ssh.AuthMethod{ssh.Password("password")},
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }

    // 连接到SSH服务器
    conn, err := ssh.Dial("tcp", "remote.server:22", config)
    if err != nil {
        log.Fatalf("Failed to dial: %s", err)
    }
    defer conn.Close()

    // 执行远程命令
    session, err := conn.NewSession()
    if err != nil {
        log.Fatalf("Failed to create session: %s", err)
    }
    defer session.Close()

    session.Stdout = os.Stdout
    session.Stderr = os.Stderr
    if err := session.Run("your_remote_command"); err != nil {
        log.Fatalf("Failed to run: %s", err)
    }
}

注意,这只是一个基础示例,实际应用中应考虑安全性(如使用公钥认证)和错误处理。

回到顶部