This repository has been archived by the owner on May 24, 2023. It is now read-only.
forked from google/goexpect
/
telnet.go
70 lines (58 loc) · 1.42 KB
/
telnet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// telnet crates a new Expect spawner for Telnet.
package main
import (
"flag"
"fmt"
"time"
expect "github.com/google/goexpect"
"github.com/golang/glog"
"github.com/google/goterm/term"
"github.com/ziutek/telnet"
)
const (
network = "tcp"
address = "telehack.com:23"
timeout = 10 * time.Second
command = "geoip"
)
func main() {
flag.Parse()
fmt.Println(term.Bluef("Telnet spawner example"))
exp, _, err := telnetSpawn(address, timeout, expect.Verbose(true))
if err != nil {
glog.Exitf("telnetSpawn(%q,%v) failed: %v", address, timeout, err)
}
defer func() {
if err := exp.Close(); err != nil {
glog.Infof("exp.Close failed: %v", err)
}
}()
res, err := exp.ExpectBatch([]expect.Batcher{
&expect.BExp{R: `\n\.`},
&expect.BSnd{S: command + "\r\n"},
&expect.BExp{R: `\n\.`},
}, timeout)
if err != nil {
glog.Exitf("exp.ExpectBatch failed: %v , res: %v", err, res)
}
fmt.Println(term.Greenf("Res: %s", res[len(res)-1].Output))
}
func telnetSpawn(addr string, timeout time.Duration, opts ...expect.Option) (expect.Expecter, <-chan error, error) {
conn, err := telnet.Dial(network, addr)
if err != nil {
return nil, nil, err
}
resCh := make(chan error)
return expect.SpawnGeneric(&expect.GenOptions{
In: conn,
Out: conn,
Wait: func() error {
return <-resCh
},
Close: func() error {
close(resCh)
return conn.Close()
},
Check: func() bool { return true },
}, timeout, opts...)
}