Guest User

Untitled

a guest
Aug 16th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bytes"
  5. "fmt"
  6. "io"
  7. "os"
  8. "os/signal"
  9. "syscall"
  10.  
  11. "golang.org/x/crypto/ssh"
  12. "golang.org/x/crypto/ssh/terminal"
  13. )
  14.  
  15. func main() {
  16. host := "target.host.local"
  17. port := "22"
  18. user := "user"
  19. pass := "password"
  20.  
  21. // Create sshClientConfig
  22. sshConfig := &ssh.ClientConfig{
  23. User: user,
  24. Auth: []ssh.AuthMethod{
  25. ssh.Password(pass),
  26. },
  27. HostKeyCallback: ssh.InsecureIgnoreHostKey(),
  28. }
  29.  
  30. // SSH connect.
  31. client, err := ssh.Dial("tcp", host+":"+port, sshConfig)
  32.  
  33. // Create Session
  34. session, err := client.NewSession()
  35. defer session.Close()
  36.  
  37. // キー入力を接続先が認識できる形式に変換する(ここがキモ)
  38. fd := int(os.Stdin.Fd())
  39. state, err := terminal.MakeRaw(fd)
  40. if err != nil {
  41. fmt.Println(err)
  42. }
  43. defer terminal.Restore(fd, state)
  44.  
  45. // ターミナルサイズの取得
  46. w, h, err := terminal.GetSize(fd)
  47. if err != nil {
  48. fmt.Println(err)
  49. }
  50.  
  51. modes := ssh.TerminalModes{
  52. ssh.ECHO: 1,
  53. ssh.TTY_OP_ISPEED: 14400,
  54. ssh.TTY_OP_OSPEED: 14400,
  55. }
  56.  
  57. err = session.RequestPty("xterm", h, w, modes)
  58. if err != nil {
  59. fmt.Println(err)
  60. }
  61.  
  62. log := new(bytes.Buffer)
  63. logFile, _ := os.OpenFile("./ssh_term_with_log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600)
  64.  
  65. session.Stdout = io.MultiWriter(os.Stdout, logFile)
  66. session.Stderr = io.MultiWriter(os.Stderr, logFile)
  67. session.Stdin = os.Stdin
  68.  
  69. err = session.Shell()
  70. if err != nil {
  71. fmt.Println(err)
  72. }
  73.  
  74. // ターミナルサイズの変更検知・処理
  75. signal_chan := make(chan os.Signal, 1)
  76. signal.Notify(signal_chan, syscall.SIGWINCH)
  77. go func() {
  78. for {
  79. s := <-signal_chan
  80. switch s {
  81. case syscall.SIGWINCH:
  82. fd := int(os.Stdout.Fd())
  83. w, h, _ = terminal.GetSize(fd)
  84. session.WindowChange(h, w)
  85. }
  86. }
  87. }()
  88.  
  89. err = session.Wait()
  90. if err != nil {
  91. fmt.Println(err)
  92. }
  93. }
Add Comment
Please, Sign In to add comment