ing
This commit is contained in:
commit
1076082050
41
main.go
Normal file
41
main.go
Normal file
|
@ -0,0 +1,41 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"git.loafle.net/overflow/ssh_crawler/ssh"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
|
||||
func main() {
|
||||
|
||||
const ip = "192.168.1.15"
|
||||
const port = "22"
|
||||
const user = "administrator"
|
||||
const pw = "!@#$qwer1234"
|
||||
|
||||
client, err := connectSSH(ip, port, user, pw)
|
||||
if err != nil {
|
||||
fmt.Errorf("%s", err)
|
||||
}
|
||||
|
||||
res, err := client.CPUStat()
|
||||
if err != nil {
|
||||
fmt.Errorf("%s", err)
|
||||
}
|
||||
fmt.Printf("%s", res)
|
||||
|
||||
client.Close()
|
||||
}
|
||||
|
||||
func connectSSH(ip, port, user, pw string) (*ssh.SSHClient, error){
|
||||
client, err := ssh.New(ip, port, user, pw)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return client, nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
100
ssh/ssh.go
Normal file
100
ssh/ssh.go
Normal file
|
@ -0,0 +1,100 @@
|
|||
package ssh
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"golang.org/x/crypto/ssh"
|
||||
"bytes"
|
||||
"git.loafle.net/overflow/ssh_crawler/stat"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type SSHConfig struct {
|
||||
User string
|
||||
Auth []ssh.AuthMethod
|
||||
Host string
|
||||
Port int
|
||||
}
|
||||
|
||||
type SSHClient struct {
|
||||
Session *ssh.Session
|
||||
}
|
||||
|
||||
func New(ip, port, user, pw string) (*SSHClient, error) {
|
||||
p, _ := strconv.Atoi(port)
|
||||
info := &SSHConfig {
|
||||
User: user,
|
||||
Auth: []ssh.AuthMethod{
|
||||
ssh.Password(pw),
|
||||
},
|
||||
Host: ip,
|
||||
Port: p,
|
||||
}
|
||||
session, err := info.Session()
|
||||
if err != nil {
|
||||
fmt.Errorf("%s", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &SSHClient{
|
||||
Session: session,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (info *SSHConfig) Session() (*ssh.Session, error) {
|
||||
sshConfig := &ssh.ClientConfig{
|
||||
User: info.User,
|
||||
Auth: info.Auth,
|
||||
HostKeyCallback:ssh.InsecureIgnoreHostKey(),
|
||||
}
|
||||
|
||||
connection, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", info.Host, info.Port), sshConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
session, err := connection.NewSession()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
modes := ssh.TerminalModes{
|
||||
ssh.ECHO: 0, // disable echoing
|
||||
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
|
||||
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
|
||||
}
|
||||
|
||||
if err := session.RequestPty("xterm", 80, 40, modes); err != nil {
|
||||
session.Close()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
return session, nil
|
||||
}
|
||||
|
||||
func (cli *SSHClient) Close() {
|
||||
cli.Session.Close()
|
||||
}
|
||||
|
||||
func (cli *SSHClient) RunCommand(command string) ([]byte, error) {
|
||||
|
||||
var b bytes.Buffer
|
||||
cli.Session.Stdout = &b
|
||||
|
||||
err := cli.Session.Run(command)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b.Bytes(), nil
|
||||
}
|
||||
|
||||
func (cli *SSHClient) CPUStat()([]stat.CPUStat, error) {
|
||||
cpu := &stat.CPUStat{}
|
||||
|
||||
b, err := cli.RunCommand(cpu.Command())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return cpu.Parse(bytes.NewReader(b))
|
||||
}
|
67
stat/cpu.go
Normal file
67
stat/cpu.go
Normal file
|
@ -0,0 +1,67 @@
|
|||
package stat
|
||||
|
||||
import (
|
||||
"io"
|
||||
"bufio"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type CPUStat struct {
|
||||
device,
|
||||
user,
|
||||
nice,
|
||||
system,
|
||||
idle,
|
||||
iowait,
|
||||
irq,
|
||||
softIrq,
|
||||
steal, // (over 2.6.11)
|
||||
guest, // (over 2.6.24)
|
||||
guestNice string //(over 2.6.33)
|
||||
}
|
||||
|
||||
func (cpu CPUStat) Command() string {
|
||||
return "cat /proc/stat"
|
||||
}
|
||||
|
||||
func (cpu CPUStat) Parse(r io.Reader) ([]CPUStat, error) {
|
||||
var (
|
||||
CPUStats = []CPUStat{}
|
||||
scanner = bufio.NewScanner(r)
|
||||
)
|
||||
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
parts := strings.Fields(line)
|
||||
if !strings.HasPrefix(parts[0], "cpu") {
|
||||
continue
|
||||
}
|
||||
|
||||
steal, guest, guestNice := "", "", ""
|
||||
if len(parts) > 8 {
|
||||
steal = parts[8]
|
||||
}
|
||||
if len(parts) > 9 {
|
||||
guest = parts[9]
|
||||
}
|
||||
if len(parts) > 10 {
|
||||
guestNice = parts[10]
|
||||
}
|
||||
|
||||
CPUStats = append(CPUStats, CPUStat{
|
||||
device: parts[0],
|
||||
user: parts[1],
|
||||
nice: parts[2],
|
||||
system: parts[3],
|
||||
idle: parts[4],
|
||||
iowait: parts[5],
|
||||
irq: parts[6],
|
||||
softIrq: parts[7],
|
||||
steal: steal,
|
||||
guest: guest,
|
||||
guestNice: guestNice,
|
||||
})
|
||||
}
|
||||
|
||||
return CPUStats, scanner.Err()
|
||||
}
|
8
stat/stat.go
Normal file
8
stat/stat.go
Normal file
|
@ -0,0 +1,8 @@
|
|||
package stat
|
||||
|
||||
import "io"
|
||||
|
||||
type Stat interface {
|
||||
Command() string
|
||||
Parse(r io.Reader) ([]CPUStat, error)
|
||||
}
|
Loading…
Reference in New Issue
Block a user