为什么 go 执行命令时,获取不了 Telnet 的输出

2020-10-26 01:53:33 +08:00
 toomlo

因为一些原因,需要用 go 执行无交互的 Telnet命令并获取输出的数据

命令是这样:

(echo "keys *"; sleep 0.02) | telnet 127.0.0.1 6379

直接在终端下执行,返回如下:

https://i.imgur.com/qMU7vYG.png

然后我写了下面的代码来测试

//main.go
package main

import (
	"bytes"
	"flag"
	"os/exec"
)

func main(){
	c := flag.String("c", "ifconfig", "ifconfg")
	flag.Parse()

	var cmd *exec.Cmd
	var stdout bytes.Buffer
	var stderr bytes.Buffer
	
	cmd = exec.Command("bash", "-c", *c)
	cmd.Stdout = &stdout
	cmd.Stderr = &stderr

	err := cmd.Run()
	if err == nil {
		print(stdout.String())
	} else {
		print(stderr.String())
	}
}

执行命令:

go run main.go -c "(echo \"keys *\"; sleep 0.02) | telnet 127.0.0.1 6379"

输出的内容为:Connection closed by foreign host.

我最后测试下面这条命令后,上面的程序就可以成功获取到直接在终端下执行非交互命令的输出了

go run main.go -c "(echo \"keys *\"; sleep 0.02) | telnet 127.0.0.1 6379" > 1.txt; cat 1.txt; rm 1.txt

https://i.imgur.com/6LghpDl.png

上面的实际上是将 Telnet 的输出写入到文件里面,然后 cat 这个文件(cat 是标准输出),golang 执行命令的话就能获取到了

还有没有同学有更优雅的命令来实现 golang 读取 Telnet 的输出啊(不改 go 代码) 先谢谢了~~~

2845 次点击
所在节点    Go 编程语言
14 条回复
Phant0m
2020-10-26 03:58:56 +08:00
把 sleep 换成 exit 就行了
eudore
2020-10-26 08:36:22 +08:00
telnet 的效果 net.Dial 不就行了吗?
oott123
2020-10-26 09:08:50 +08:00
我觉得你在连 redis 服务器
那么直接用 go 的 redis 客户端库不好吗
GopherDaily
2020-10-26 09:52:21 +08:00
Search ``golang exec pipe``
mengzhuo
2020-10-26 09:54:43 +08:00
端口通不通,用 net 包他不香么
monkeyWie
2020-10-26 10:31:53 +08:00
标准输出和错误输出复用一个 buffer 就行了,已测试通过
yanzhiling2001
2020-10-26 10:49:27 +08:00
如果只是单纯的测端口通不通,net 包应该够用了,要调 ifconfig 干嘛
toomlo
2020-10-26 14:48:06 +08:00
@oott123 #3
@eudore #2

因为我这个是在极端环境下需要用到~~~所以才来问嘛,/哭哭
toomlo
2020-10-26 14:50:30 +08:00
@monkeyWie #6 原谅我太菜了,感谢!!!
popvlovs
2020-10-26 19:58:07 +08:00
测连通性我一般用这个:echo > /dev/tcp/$ip/$port
labulaka521
2020-10-26 22:23:17 +08:00
我记着有个方法可以获取全部支持
zunceng
2020-10-27 09:22:57 +08:00
telnet 太麻烦了 你用 redis-cli 也要好一点
labulaka521
2020-10-27 10:29:15 +08:00
CombinedOutput 可以获取全部输出
toomlo
2020-10-27 18:23:06 +08:00
@labulaka521 #13 我之前用的这个,获取不了错误信息,比如你在终端执行一条不存在命令会提示命令不存在,但是 CombinedOutput 获取不了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/718498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX