Go语言执行/生成一个SSH会话。

huangapple go评论113阅读模式
英文:

Go Lang exec/spawn a ssh session

问题

我正在尝试解决分叉/启动SSH终端会话的机制,即如果我执行此程序,我希望能够登录到远程服务器(我的密钥位于服务器上)。

目前,程序只是执行了,但没有任何反应。

以下是翻译好的代码:

package main

import (
    "os/exec"
    "os"
)

func main() {
    cmd := exec.Command("ssh", "root@SERVER-IP")
    cmd.Stdout = os.Stdout
    //cmd.Stderr = os.Stderr
    cmd.Run()
}

请注意,这只是一个示例代码,你需要将"SERVER-IP"替换为实际的服务器IP地址。

英文:

I'm trying to work out the mechanism to fork/start a ssh terminal session
i.e I want to be logged into remote server (my keys are on server) if I execute this program.

Right now it just executes but nothing happens.

package main

import (
 "os/exec"   
 "os"
)

func main() {
  cmd := exec.Command("ssh","root@SERVER-IP")
  cmd.Stdout = os.Stdout
  //cmd.Stderr = os.Stderr
  cmd.Run()

}

答案1

得分: 5

cmd.Run等待命令完成。你的ssh会话通常不会在没有用户交互的情况下退出。因此,你的程序会阻塞,因为它等待ssh进程完成。

你可能想要:

  • 也重定向Stdin,这样你可以与ssh会话进行交互

  • 执行ssh me@server somecommand。在最后一种形式中,会执行特定的命令并重定向该命令的输出。

  • 查看ssh包

英文:

cmd.Run waits for the command to complete. Your ssh session should (normally) not exit without user interaction. Therefore your program blocks, since it waits for the ssh process to finish.

You may want to either

  • also redirect Stdin, so you can interact with the ssh session
  • execute ssh me@server somecommand. In the last form a specific command gets executed and the output of this command gets redirected.
  • take a look at the ssh package

答案2

得分: -2

我已经完成了一个可以满足你需求的库:https://github.com/shagabutdinov/shell;你可以查看一下,看它是否有帮助。

你可以使用这个库来启动 SSH 会话并执行命令:

key, err := ssh.ParsePrivateKey([]byte(YOUR_PRIVATE_KEY))
if err != nil {
    panic(err)
}

shell, err := shell.NewRemote(shell.RemoteConfig{
    Host: "root@example.com:22",
    Auth: []ssh.AuthMethod{ssh.PublicKeys(key)},
})

if err != nil {
    panic(err)
}

shell.Run("cat /etc/hostname", func(_ int, message string) {
    log.Println(message) // example.com
})

这是对 Golang SSH 库的简单封装,可以帮助执行连续的 /bin/sh 命令。

英文:

I've done library that can cover your requiremenets: https://github.com/shagabutdinov/shell; checkout if it helps or not.

You can use this library to start ssh session and execute the commands:

key, err := ssh.ParsePrivateKey([]byte(YOUR_PRIVATE_KEY))
if(err != nil) {
     panic(err)
}

shell, err = shell.NewRemote(shell.RemoteConfig{
    Host: "root@example.com:22",
    Auth: []ssh.AuthMethod{ssh.PublicKeys(key)},
})

if(err != nil) {
    panic(err)
}

shell.Run("cat /etc/hostname", func(_ int, message string) {
      log.Println(message) // example.com
})

This is simple wrapper over golang ssh library that helps to execute consequent commands over /bin/sh.

huangapple
  • 本文由 发表于 2014年3月20日 17:46:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/22528985.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定