Golang Go语言中为什么执行命令时获取不了Telnet的输出

发布于 1周前 作者 ionicwang 来自 Go语言

Golang Go语言中为什么执行命令时获取不了Telnet的输出

因为一些原因,需要用 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 代码) 先谢谢了~~~


更多关于Golang Go语言中为什么执行命令时获取不了Telnet的输出的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

15 回复

把 sleep 换成 exit 就行了

更多关于Golang Go语言中为什么执行命令时获取不了Telnet的输出的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


telnet 的效果 net.Dial 不就行了吗?

我觉得你在连 redis 服务器
那么直接用 go 的 redis 客户端库不好吗

Search golang exec pipe

端口通不通,用 net 包他不香么

标准输出和错误输出复用一个 buffer 就行了,已测试通过

如果只是单纯的测端口通不通,net 包应该够用了,要调 ifconfig 干嘛

#3
#2

因为我这个是在极端环境下需要用到~~~所以才来问嘛,/哭哭

#6 原谅我太菜了,感谢!!!

测连通性我一般用这个:echo > /dev/tcp/$ip/$port

我记着有个方法可以获取全部支持

telnet 太麻烦了 你用 redis-cli 也要好一点

CombinedOutput 可以获取全部输出

#13 我之前用的这个,获取不了错误信息,比如你在终端执行一条不存在命令会提示命令不存在,但是 CombinedOutput 获取不了

在Go语言中,执行命令并获取其输出(如Telnet的输出)通常依赖于标准库中的os/exec包。如果在尝试获取Telnet输出时遇到问题,可能的原因及解决方案如下:

  1. 交互式命令问题:Telnet是一个交互式协议,而exec.Command默认不处理交互式输入。你可能需要更复杂的机制来管理输入输出流,比如使用os.Stdinos.Stdoutos.Stderr的管道,或者使用第三方库如expect来处理交互。

  2. 命令未正确执行:确保命令路径和参数正确无误。对于Telnet,需要指定主机和端口,这通常通过命令行参数实现。

  3. 输出缓冲:有时输出可能因缓冲而未立即显示。尝试在读取输出后调用Wait()方法,确保命令执行完成。

  4. 权限问题:确保运行Go程序的用户有足够的权限执行Telnet命令,并访问网络。

  5. 使用更适合的库:对于复杂的网络协议如Telnet,考虑使用专门的Go库(如golang.org/x/crypto/ssh对于SSH,虽然它不是为Telnet设计的,但原理相似),这些库提供了更高级别的抽象,易于处理复杂的网络交互。

  6. 调试:使用exec.CommandContext和上下文超时来调试命令执行,或检查命令的错误输出以获取更多信息。

总之,处理Telnet这类交互式命令时,需要更细致地管理输入输出流和错误处理。

回到顶部