新手遇到坑,想问大佬一个问题,panic: The handle is invalid.

weixin_38056080 2019-09-20 09:50:16
#### 同一段代码,在linux 里运行正常, 在windows下面运行报 The handle is invalid.



#### 下面是源码
```go
package main

import (
"go_ssh1/conn"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/terminal"
"log"
"os"
)

func main() {

session, err := conn.Connect("root", "xxx", "192.168.1.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()

fd := int(os.Stdin.Fd())
oldState, err := terminal.MakeRaw(fd) // winodws 下MakeRam handle is invalid.

if err != nil {
panic(err)
}
defer terminal.Restore(fd, oldState)

//excute command
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin

termWidth, termHeight, err := terminal.GetSize(fd)
if err != nil {
panic(err)
}

//Set up terminal modes
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 {
log.Fatal(err)
}

session.Run("top")
}


--------------------------------
connect.go

import (
"fmt"
"golang.org/x/crypto/ssh"
"net"
"time"
)

func Connect(user, password, host string, port int) (*ssh.Session, error) {
var (
auth []ssh.AuthMethod
addr string
clientConfig *ssh.ClientConfig
client *ssh.Client
session *ssh.Session
err error
)

// get auth method
auth = make([]ssh.AuthMethod, 0)
auth = append(auth, ssh.Password(password))
clientConfig = &ssh.ClientConfig{
User: user,
Auth: auth,
Timeout: 30 * time.Second,
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
return nil
},
}

addr = fmt.Sprintf("%s:%d", host, port)

if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
return nil, err
}


if session, err = client.NewSession(); err != nil {
return nil, err
}

return session, nil
}
```
#### 谢谢!
...全文
15 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧