commit 1076082050de7524771b773375e077496a8ab44a Author: insanity Date: Fri Oct 20 15:10:30 2017 +0900 ing diff --git a/main.go b/main.go new file mode 100644 index 0000000..e104bc8 --- /dev/null +++ b/main.go @@ -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 +} + + + + + diff --git a/ssh/ssh.go b/ssh/ssh.go new file mode 100644 index 0000000..80489da --- /dev/null +++ b/ssh/ssh.go @@ -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)) +} diff --git a/stat/cpu.go b/stat/cpu.go new file mode 100644 index 0000000..8b4c76f --- /dev/null +++ b/stat/cpu.go @@ -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() +} diff --git a/stat/stat.go b/stat/stat.go new file mode 100644 index 0000000..8bdd152 --- /dev/null +++ b/stat/stat.go @@ -0,0 +1,8 @@ +package stat + +import "io" + +type Stat interface { + Command() string + Parse(r io.Reader) ([]CPUStat, error) +}