如何选择有效的案例执行



我用https://github.com/google/goexpect作为我的shell交互,PPPoE拨号程序,我的操作系统CentOS7,我的拨号程序rp PPPoE,第一次,比如1。拨号时如何编写goexpect交互?

我知道问题在哪里,也不知道如何解决。当我创建一个具有并发性的拨号时,第一次交互的逻辑与后续交互的逻辑不同。例如,第二篇的内容与第一篇的内容不同,它增加了一个新的问题:(default ppp0) or enter 'n' if you Want to create a new one:,我看到goexpectExpectSwitchCase的操作,但我不太明白如何用它来解决我的问题。如何匹配其中一个交互逻辑而忽略其他条件。

  1. 第一次执行交互
Welcome to the PPPoE client setup.  First, I will run some checks on
your system to make sure the PPPoE client is installed properly...

LOGIN NAME
Enter your Login Name (default root): USER
  1. 当我执行第二次交互时,如何使用google/goexpect在多个条件中匹配一个,并继续执行下一步
Welcome to the PPPoE client setup.  First, I will run some checks on
your system to make sure the PPPoE client is installed properly...
The following DSL config was found on your system:
Device:      Name:
ppp0         DSLppp0
Please enter the device if you want to configure the present DSL config
(default ppp0) or enter 'n' if you want to create a new one:n
LOGIN NAME
Enter your Login Name: USER
  1. 我的代码,但无法正常工作
package shell
import (
"fmt"
expect "github.com/google/goexpect"
"github.com/google/goterm/term"
"regexp"
"time"
)

func R(user, password, dev string) error {
fmt.Println(term.Bluef("Telnet spawner example"))
to := 3 * time.Second
exec, _, err := expect.Spawn("/usr/sbin/pppoe-setup", to)
if err != nil {
return err
}
defer exec.Close()
r, rs, _, err := exec.ExpectSwitchCase([]expect.Caser{
&expect.Case{R: regexp.MustCompile(`Enter your Login Name (default root):`), S: user + "n", T: expect.Next(), Rt: 0},
&expect.Case{R: regexp.MustCompile(`or enter 'n' if you want to create a new one:`), S: "nn"},
}, to)
if err != nil {
return err
}
fmt.Println("r:rs:", r, rs)
ur, urs, err := exec.Expect(regexp.MustCompile(`Enter your Login Name`), to)
if err != nil {
return err
}
fmt.Println("ur:urs:", ur, urs)

if err := exec.Send(user + "n"); err != nil {
fmt.Println("here03:", err.Error())
return err
}
dr, drs, err := exec.Expect(regexp.MustCompile(`(default eth0):`), to)
if err != nil {
fmt.Println("here04:", err.Error())
return err
}
fmt.Println(dr, drs)
if err := exec.Send(dev + "n"); err != nil {
fmt.Println("here05:", err.Error())
return err
}
er, ers, err := exec.Expect(regexp.MustCompile(`Enter the demand value (default no):`), to)
if err != nil {
fmt.Println("here06:", err.Error())
return err
}
fmt.Println(er, ers)
if err := exec.Send("n"); err != nil {
fmt.Println("here06x:", err.Error())
return err
}
if _, _, err := exec.Expect(regexp.MustCompile(`Enter the DNS information here:`), to); err != nil {
fmt.Println("here06x:", err.Error())
return err
}
if err := exec.Send("n"); err != nil {
fmt.Println("here07:", err.Error())
return err
}
if _, _, err := exec.Expect(regexp.MustCompile(`Please enter your Password:`), to); err != nil {
fmt.Println("here08:", err.Error())
return err
}
if err := exec.Send(password + "n"); err != nil {
fmt.Println("sendhere08:", err.Error())
return err
}
if _, _, err := exec.Expect(regexp.MustCompile(`Please re-enter your Password:`), to); err != nil {
fmt.Println("here0801:", err.Error())
return err
}
if err := exec.Send(password + "n"); err != nil {
fmt.Println("sendhere0801:", err.Error())
return err
}
if _, _, err := exec.Expect(regexp.MustCompile(`normal user to start or stop DSL connection (default yes):`), to); err != nil {
fmt.Println("here09:", err.Error())
return err
}
if err := exec.Send("yesn"); err != nil {
fmt.Println("here10:", err.Error())
return err
}
if _, _, err := exec.Expect(regexp.MustCompile(`Choose a type of firewall (0-2):`), to); err != nil {
fmt.Println("here11:", err.Error())
return err
}
if err := exec.Send("0n"); err != nil {
fmt.Println("here12:", err.Error())
return err
}
if _, _, err := exec.Expect(regexp.MustCompile(`Please enter no or yes (default no):`), to); err != nil {
fmt.Println("here13:", err.Error())
return err
}
if err := exec.Send("yesn"); err != nil {
fmt.Println("here14:", err.Error())
return err
}
fr, frs, err := exec.Expect(regexp.MustCompile(`Accept these settings and adjust configuration files (y/n)?`), to);
if err != nil {
fmt.Println("here15:", err.Error())
return err
}
fmt.Println(fr,frs)
if err := exec.Send("yn"); err != nil {
fmt.Println("here16:", err.Error())
return err
}
return nil
}
  1. 这是主文件@Josh Chappelle
package main
import (
"fmt"
"github.com/seraphico/ppps/pkg/shell"
)
func main() {
err := shell.R("test01", "test01", "br3")
if err != nil {
fmt.Println(err.Error())
return
}
}

谢谢,我可以修复它。

ro, _, _, err := exec.ExpectSwitchCase([]expect.Caser{
&expect.Case{R: regexp.MustCompile("if you want to create a new one:"), S: "nn", T: expect.Next(), Rt: 1},
&expect.Case{R: regexp.MustCompile(`Enter your Login Name:`), S: user + "n", Rt: 0},
&expect.Case{R: regexp.MustCompile(`Enter your Login Name (default root):`), S: user + "n", Rt: 0},
}, to)
if err != nil {
return err
}

如果if you want to create a new one:如果匹配不成功,则联接t状态为下一个,并将Rt设置为1。

最新更新