首先需求是调用 ssh 访问腾讯云云实例执行 A 脚本,然后对此云实例进行重启,开机完成后再执行 B 脚本。从执行 A ,重启到开机都没有问题,但是在执行 B 脚本前新建 session 时,调用 client.NewSession()方法一直返回 error:EOF ,实在是定位不到问题,求大佬指教。
我的 ssh 连接逻辑抽取的方法:
func SSHConnect(host string) (*ssh.Client, error) {
var (
addr string
clientConfig *ssh.ClientConfig
client *ssh.Client
err error
)
homePath, err := os.UserHomeDir()
if err != nil {
return nil, err
}
key, err := ioutil.ReadFile(path.Join(homePath, ".ssh", "id_rsa"))
zap.L().Info("key", zap.String("path", path.Join(homePath, ".ssh", "id_rsa")))
if err != nil {
return nil, err
}
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
return nil, err
}
clientConfig = &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
Timeout: 30 * time.Second,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
// connect to ssh
addr = fmt.Sprintf("%s:%d", host, 22)
if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
//err = errors.Wrapf(err, "")
return nil, err
}
return client, nil
}
调用 ssh 执行脚本 A:
var connectShut *ssh.Client
var sessionShut *ssh.Session
connectShut, err = util.SSHConnect(*ip[0])
if err != nil {
zap.L().Error("mysqlToggleWorker SSHConnect error", zap.Error(err), zap.Any("ip", *ip[0]))
return err
}
sessionShut, err = connectShut.NewSession()
if err != nil {
zap.L().Error("mysqlToggleWorker NewSession error", zap.Error(err), zap.Any("ip", *ip[0]))
return err
}
shCommand := "sh " + shPath
output, err := sessionShut.CombinedOutput(shCommand)
if err != nil {
zap.L().Error("mysqlToggleWorker Run error", zap.Error(err), zap.Any("ip", *ip[0]),
zap.Any("shCommand", shCommand), zap.String("result", string(output)))
}
err = sessionShut.Close()
if err != nil || err != io.EOF {
zap.L().Error("mysqlToggleWorker sessionShut.Close() error", zap.Error(err), zap.Any("ip", *ip[0]))
}
err = connectShut.Close()
if err != nil {
zap.L().Error("mysqlToggleWorker connectShut.Close() error", zap.Error(err), zap.Any("ip", *ip[0]))
}
省略重启的过程,下面开始调用脚本 B:
var connectStart *ssh.Client
var sessionStart *ssh.Session
connectStart, err = util.SSHConnect(*ip[0])
sessionStart, err = connectStart.NewSession()
if err != nil {
zap.L().Error("mysqlToggleWorker DescribeInstancesStatus error", zap.Error(err), zap.Any("ip", *ip[0]))
return err
}
此时返回的 err 为:{"error": "EOF", "ip": "10.1.0.1"}
百思不得其解,求大佬指教~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.