最近写了一个golang ssh客户端,参照网上的ssh client做了些修改,如果需要进行操作审计,那用golang生成的ssh代替原生的ssh就非常简单了


代码如下

package main

import (
   "fmt"
   "golang.org/x/crypto/ssh"
   "golang.org/x/crypto/ssh/terminal"
   "os"
   "log"
   "io/ioutil"
   "flag"
   "os/user"
   "time"
   "net"
)

func Client(userName, ip, sshKey string) {

   privateKey, err := ioutil.ReadFile(sshKey)
   if err != nil {
      log.Fatal(err)
   }

   signer, err := ssh.ParsePrivateKey(privateKey)
   if err != nil {
      log.Fatal(err)
   }

   config := &ssh.ClientConfig{
      User: userName,
      Auth: []ssh.AuthMethod{
         ssh.PublicKeys(signer),
      },
      HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
         return nil
      },
      Timeout: 30 * time.Second,
   }

   client, err := ssh.Dial("tcp", ip, config)
   if err != nil {
      fmt.Println("建立连接: ", err)
      return
   }
   defer client.Close()
   session, err := client.NewSession()
   if err != nil {
      fmt.Println("创建Session出错: ", err)
      return
   }
   defer session.Close()

   fd := int(os.Stdin.Fd())
   oldState, err := terminal.MakeRaw(fd)
   if err != nil {
      fmt.Println("创建文件描述符: ", err)
      return
   }

   session.Stdout = os.Stdout
   session.Stderr = os.Stderr
   session.Stdin = os.Stdin

   termWidth, termHeight, err := terminal.GetSize(fd)
   if err != nil {
      fmt.Println("获取窗口宽高: ", err)
      return
   }
   defer terminal.Restore(fd, oldState)

   modes := ssh.TerminalModes{
      ssh.ECHO:          1,
      ssh.TTY_OP_ISPEED: 14400,
      ssh.TTY_OP_OSPEED: 14400,
   }

   if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
      fmt.Println("创建终端出错: ", err)
      return
   }

   err = session.Shell()
   if err != nil {
      fmt.Println("执行Shell出错: ", err)
      return
   }

   err = session.Wait()
   if err != nil {
      fmt.Println("执行Wait出错: ", err)
      return
   }
}

func main() {

   usr, err := user.Current()
   if err != nil {
      fmt.Println(err)
   }

   var sshF = usr.HomeDir + "/.ssh/id_rsa"

   p := flag.String("p", "22", "输入端口")
   i := flag.String("i", sshF, "输入所需的私钥")
   ip := flag.String("ip", "", "输入ip地址")
   flag.Parse()
   fmt.Println("  __              _               _")
   fmt.Println(" / _|_   _ _ __  | |___   __   __| | _____   _____  _ __  ___")
   fmt.Println("| |_| | | | '_ \\ | __\\ \\ / /  / _ ` |/ _ \\ \\ / / _ \\| '_ \\/ __|")
   fmt.Println("|  _| |_| | | | || |_ \\ V /  | (_| |  __/\\ V / (_) | |_) \\__ \\")
   fmt.Println("|_|  \\__,_|_| |_(_)__| \\_/    \\__,_|\\___| \\_/ \\___/| .__/|___/")
   fmt.Println("                                                   |_|")
   fmt.Println("     ,           ,")
   fmt.Println("    /             \\")
   fmt.Println("   ((__---,,,---__))")
   fmt.Println("      (_) O O (_)_________")
   fmt.Println("         \\ _ /            |\\")
   fmt.Println("          o_o \\ voilet    | \\")
   fmt.Println("               \\   _____  |  *")
   fmt.Println("                |||   WW|||")
   fmt.Println("                |||     |||")
   fmt.Println("")
   fmt.Println("--------------------------------------------------------------")
   fmt.Println("如有任何系统问题,请随时联系运维人员")
   fmt.Println("运维邮箱: voilet@qq.com")
   fmt.Println("友情提示:谨慎操作,规避风险")
   fmt.Println("ssh -i ./ssh/id_rsa -p 2222 -ip 192.168.1.1")
   fmt.Println("可使用的参数 -P指定端口 -i指定key -ip需要登录的主机")
   fmt.Println("-------------------------------------------------------------")

   Client(usr.Name, *ip + ":" + *p, *i)
}


分享到: 更多

这篇日志的 QR 二维码为:

二月 10th, 2017

Posted In: linux系统

标签:,

无觅相关文章插件,快速提升流量