Go 连接ssh服务器
安装
go get -u -v golang.org/x/crypto/ssh
实例
package main
import (
"bytes"
"fmt"
"log"
"golang.org/x/crypto/ssh"
"time"
)
func main() {
config := &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.Password("123456"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: time.Second * 3,
}
client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
if err != nil {
log.Fatal(err.Error())
}
defer client.Close()
session, err := client.NewSession()
if err != nil {
log.Fatal(err.Error())
}
var stdout bytes.Buffer
var stderr bytes.Buffer
session.Stdout = &stdout
session.Stderr = &stderr
err = session.Run("hostname")
if err != nil {
log.Fatal(err.Error())
return
}
defer session.Close()
fmt.Println(string(stdout.Bytes()))
}
密钥认证
func main() {
privateKey, err := ioutil.ReadFile("/root/.ssh/id_rsa")
if err != nil {
log.Fatal(err.Error())
}
signer, err = ssh.ParsePrivateKey(privateKey)
# signer, err = ssh.ParsePrivateKeyWithPassphrase(privateKey, []byte(passParse))
if err != nil {
log.Fatal(err.Error())
}
auth := []ssh.AuthMethod{
ssh.PublicKeys(signer),
}
config := &ssh.ClientConfig{
User: "root",
Auth: auth,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: time.Second * 3,
}
client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
if err != nil {
log.Fatal(err.Error())
}
defer client.Close()
session, err := client.NewSession()
if err != nil {
log.Fatal(err.Error())
}
var stdout bytes.Buffer
var stderr bytes.Buffer
session.Stdout = &stdout
session.Stderr = &stderr
err = session.Run("hostname")
if err != nil {
log.Fatal(err.Error())
return
}
defer session.Close()
fmt.Println(string(stdout.Bytes()))
}
文件传输
func main() {
config := &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.Password("123456"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: time.Second * 3,
}
client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
if err != nil {
log.Fatal(err.Error())
}
defer client.Close()
var (
src string = "/etc/passwd"
dest string = "/tmp/passwd"
buffer int = 1024
)
sftpClient, err := sftp.NewClient(client)
srcFile, err := os.Open(src)
if err != nil {
log.Fatal(err.Error())
}
defer srcFile.Close()
dstFile, err := sftpClient.Create(dest)
if err != nil {
log.Fatal(err.Error())
}
defer dstFile.Close()
buf := make([]byte, buffer)
for {
block, err := srcFile.Read(buf)
if err != nil && err != io.EOF {
log.Fatal(err.Error())
}
if block == 0 || err == io.EOF {
break
}
dstFile.Write(buf)
}
}
动态刷新
func main() {
config := &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.Password("123456"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: time.Second * 3,
}
client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
if err != nil {
log.Fatal(err.Error())
}
defer client.Close()
session, err := client.NewSession()
if err != nil {
log.Fatal(err.Error())
}
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
fd := int(os.Stdin.Fd())
oldState, err := terminal.MakeRaw(fd)
if err != nil {
panic(err)
}
defer terminal.Restore(fd, oldState)
termWidth, termHeight, err := terminal.GetSize(fd)
if err != nil {
panic(err)
}
// Set up terminal modes
modes := ssh.TerminalModes{
ssh.ECHO: 1, // enable echoing
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}
// Request pseudo terminal
if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
log.Fatal(err.Error())
}
session.Run("top")
}
Last updated
Was this helpful?