Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何在使用ssh和交互式shell时模拟按键 卡在按键上_Go_Ssh - Fatal编程技术网

Go 如何在使用ssh和交互式shell时模拟按键 卡在按键上

Go 如何在使用ssh和交互式shell时模拟按键 卡在按键上,go,ssh,Go,Ssh,我正在尝试创建一个脚本,用于从HP proCurve交换机进行备份。为此,我使用了包golang.org/x/crypto/ssh Golang对我来说并不新鲜,我有相当多的“围棋”知识。但我在建立连接后被卡住了。开关要求我按任意键继续,但我不知道如何模拟按键。(见下图) 现行代码 这是我当前使用的代码: 主程序包 进口( “布菲奥” “fmt” “日志” “净额” “操作系统” “golang.org/x/crypto/ssh” ) 键入密码字符串 func main(){ 主机:=“19

我正在尝试创建一个脚本,用于从HP proCurve交换机进行备份。为此,我使用了包
golang.org/x/crypto/ssh

Golang对我来说并不新鲜,我有相当多的“围棋”知识。但我在建立连接后被卡住了。开关要求我按任意键继续,但我不知道如何模拟按键。(见下图)


现行代码 这是我当前使用的代码:

主程序包
进口(
“布菲奥”
“fmt”
“日志”
“净额”
“操作系统”
“golang.org/x/crypto/ssh”
)
键入密码字符串
func main(){
主机:=“192.168.2.43:22”
用户:=“管理员”
通过:=“管理员”
config:=&ssh.ClientConfig{
用户:用户,,
Auth:[]ssh.AuthMethod{
ssh.Password(pass),
},
Config:ssh.Config{
密钥交换:[]字符串{“diffie-hellman-group-exchange-sha1”,“diffie-hellman-group1-sha1”},
},
HostKeyCallback:ssh.HostKeyCallback(func(主机名字符串,远程net.Addr,密钥ssh.PublicKey)错误{return nil}),
}
conn,err:=ssh.Dial(“tcp”,主机,配置)
如果错误!=零{
死机(“拨号失败:+err.Error())
}
延迟连接关闭()
//每个ClientConn可以支持多个交互式会话,
//由会议代表。
会话,错误:=conn.NewSession()
如果错误!=零{
死机(“创建会话失败:+err.Error())
}
延迟会话。关闭()
//设置IO
session.Stdout=os.Stdout
session.Stderr=os.Stderr
在中,u:=session.StdinPipe()
//设置终端模式
模式:=ssh.TerminalModes{
ssh.ECHO:0,//禁用回显
ssh.TTY_OP_ISPEED:14400,//输入速度=14.4kbaud
ssh.TTY_OP_OSPEED:14400,//输出速度=14.4kbaud
}
//请求伪终端
如果错误:=session.RequestPty(“xterm”,80,40,modes);错误!=nil{
log.Fatalf(“伪终端请求失败:%s”,错误)
}
//启动远程shell
如果错误:=session.Shell();错误!=nil{
log.Fatalf(“未能启动外壳程序:%s”,错误)
}
//接受命令
为了{
reader:=bufio.NewReader(os.Stdin)
str,933;:=reader.ReadString('\n')
fmt.Fprint(in,str)
//解决方案:按键盘继续
格式打印(在“\n”中)
fmt.Fprint(在“显示运行\n”中)
}
}

我努力实现的目标 但是当我手动按下任何键时,脚本将完美地运行所有命令。有人知道我如何在下面的代码中模拟任何键吗


为了{
reader:=bufio.NewReader(os.Stdin)
str,933;:=reader.ReadString('\n')
fmt.Fprint(in,str)
//解决方案:按键盘继续
格式打印(在“\n”中)
fmt.Fprint(在“显示运行\n”中)
}

在写入ssh连接之前,您正在读取标准输入。因此,只能通过手动干预跳过此屏幕

命令行标准输入的读取应该在您希望在主机上运行的任何初始命令之后进行,因此它的组织方式如下:

//需要按键才能继续
格式打印(在“\n”中)
//列出有用的信息
fmt.Fprint(在“显示运行\n”中)
//将用户命令转发到远程shell
为了{
reader:=bufio.NewReader(os.Stdin)
str,933;:=reader.ReadString('\n')
fmt.Fprint(in,str)
}

谢谢!经过更多的解释,现在有了意义。当然,它正在发挥作用:)