Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bytes"
- "fmt"
- "io"
- "os"
- "os/signal"
- "syscall"
- "golang.org/x/crypto/ssh"
- "golang.org/x/crypto/ssh/terminal"
- )
- func main() {
- host := "target.host.local"
- port := "22"
- user := "user"
- pass := "password"
- // Create sshClientConfig
- sshConfig := &ssh.ClientConfig{
- User: user,
- Auth: []ssh.AuthMethod{
- ssh.Password(pass),
- },
- HostKeyCallback: ssh.InsecureIgnoreHostKey(),
- }
- // SSH connect.
- client, err := ssh.Dial("tcp", host+":"+port, sshConfig)
- // Create Session
- session, err := client.NewSession()
- defer session.Close()
- // キー入力を接続先が認識できる形式に変換する(ここがキモ)
- fd := int(os.Stdin.Fd())
- state, err := terminal.MakeRaw(fd)
- if err != nil {
- fmt.Println(err)
- }
- defer terminal.Restore(fd, state)
- // ターミナルサイズの取得
- w, h, err := terminal.GetSize(fd)
- if err != nil {
- fmt.Println(err)
- }
- modes := ssh.TerminalModes{
- ssh.ECHO: 1,
- ssh.TTY_OP_ISPEED: 14400,
- ssh.TTY_OP_OSPEED: 14400,
- }
- err = session.RequestPty("xterm", h, w, modes)
- if err != nil {
- fmt.Println(err)
- }
- log := new(bytes.Buffer)
- logFile, _ := os.OpenFile("./ssh_term_with_log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600)
- session.Stdout = io.MultiWriter(os.Stdout, logFile)
- session.Stderr = io.MultiWriter(os.Stderr, logFile)
- session.Stdin = os.Stdin
- err = session.Shell()
- if err != nil {
- fmt.Println(err)
- }
- // ターミナルサイズの変更検知・処理
- signal_chan := make(chan os.Signal, 1)
- signal.Notify(signal_chan, syscall.SIGWINCH)
- go func() {
- for {
- s := <-signal_chan
- switch s {
- case syscall.SIGWINCH:
- fd := int(os.Stdout.Fd())
- w, h, _ = terminal.GetSize(fd)
- session.WindowChange(h, w)
- }
- }
- }()
- err = session.Wait()
- if err != nil {
- fmt.Println(err)
- }
- }
Add Comment
Please, Sign In to add comment