英文:
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
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论