Last active
December 1, 2020 11:46
-
-
Save developer-guy/122562a766bd314c85ffb9ef2ceb8e18 to your computer and use it in GitHub Desktop.
Golang Execute Command via ssh on the remote-server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
// link: http://blog.ralch.com/tutorial/golang-ssh-connection/ | |
import ( | |
"fmt" | |
"golang.org/x/crypto/ssh" | |
"io/ioutil" | |
"log" | |
"net" | |
"time" | |
) | |
const ( | |
CertPassword = 1 | |
CertPublicKeyFile = 2 | |
DefaultTimeout = 3 // second | |
) | |
type SSH struct { | |
Ip string | |
User string | |
Cert string //password or key file path | |
Port int | |
session *ssh.Session | |
client *ssh.Client | |
} | |
func (s *SSH) readPublicKeyFile(file string) ssh.AuthMethod { | |
buffer, err := ioutil.ReadFile(file) | |
if err != nil { | |
return nil | |
} | |
key, err := ssh.ParsePrivateKey(buffer) | |
if err != nil { | |
return nil | |
} | |
return ssh.PublicKeys(key) | |
} | |
func (s *SSH) Connect(mode int) { | |
var config *ssh.ClientConfig | |
var auth []ssh.AuthMethod | |
if mode == CertPassword { | |
auth = []ssh.AuthMethod{ssh.Password(s.Cert)} | |
} else if mode == CertPublicKeyFile { | |
auth = []ssh.AuthMethod{s.readPublicKeyFile(s.Cert)} | |
} else { | |
log.Println("does not support mode: ", mode) | |
return | |
} | |
config = &ssh.ClientConfig{ | |
User: s.User, | |
Auth: auth, | |
//需要验证服务端,不做验证返回nil就可以,点击HostKeyCallback看源码就知道了 | |
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { | |
return nil | |
}, | |
Timeout: time.Second * DefaultTimeout, | |
} | |
client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", s.Ip, s.Port), config) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
session, err := client.NewSession() | |
if err != nil { | |
fmt.Println(err) | |
client.Close() | |
return | |
} | |
s.session = session | |
s.client = client | |
} | |
func (s *SSH) RunCmd(cmd string) { | |
out, err := s.session.CombinedOutput(cmd) | |
if err != nil { | |
fmt.Println(err) | |
} | |
fmt.Println(string(out)) | |
} | |
func (s *SSH) Close() { | |
s.session.Close() | |
s.client.Close() | |
} | |
//demo | |
func main() { | |
client := &SSH{ | |
Ip: "192.168.33.10", | |
User: "vagrant", | |
Port: 22, | |
Cert: "./remote-server/id_rsa", | |
} | |
client.Connect(CertPublicKeyFile) | |
client.RunCmd("cat /etc/os-release") | |
client.Close() | |
} |
Author
developer-guy
commented
Dec 1, 2020
$ mkdir -p remote-server-command-execute/remote-server
$ remote-server-command-execute/remote-server
$ ssh-keygen -t rsa -b 4096 -C "[email protected]" -f $PWD/id_rsa
$ vagrant up
$ cd ..
$ go run main.go
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment