go - 在传递给命令之前操作/读取
问题描述
如何从传递给命令标准输入的连接中读取/操作输入?
例如,给定以下代码。
c, _ := net.Dial("tcp", somehost)
cmd := exec.Command("/bin/sh")
cmd.Stdin, cmd.Stdout, cmd.Stderr = c, c, c
cmd.Run()
在将字符串传递给 cmd.Stdin 之前如何从连接中反转字符串,或者我如何解析字符串而不将其传递给 cmd.Stdin?
我考虑过从与 bufio 的连接中读取,然后将其传递给 Command 第二个参数 params,但我希望有一个更好的解决方案,它不需要我处理命令中 args 输入的所有不同情况,而只是传递分析输入后将其发送到标准输入
解决方案
好的,因为您在评论中提到“我真正的问题是如何拦截来自连接的输入,对其进行解析并将其解析为命令的标准输入。似乎当我执行 cmd.Run() 时我会阻塞,因此无法真正持续解析"
这是我将如何做到的:
import (
"io"
"os"
"os/exec"
)
func main() {
//All errors are not checked
cmd := exec.Command("/bin/sh")
cmdStdin, _ := cmd.StdinPipe()
go func() {
defer cmdStdin.Close()
//here you will need to loop on reading the connection,
//for simplicity lets assume you do that & receive data
//let says you got ls from connection
cmdStdin.Write([]byte("ls\n"))
}()
cmdStdout, _ := cmd.StdoutPipe()
go io.Copy(os.Stdout, cmdStdout)
cmd.Run()
}
推荐阅读
- php - 如何防止未定义的属性:命中 API 时的 stdClass::$data
- .htaccess - .htaceess 基于 url 中的第一个参数重定向
- c# - 从 JSON.SerializeObject 字符串属性中删除双引号
- eslint - Linter(eslint)在 Nuxt 应用程序中修复错误后保留错误
- java - Spring Boot CommandLinerRunner 测试
- android - gitlab ci .yml 安卓
- angular - Angular - 如何在没有数组的情况下使用插值显示数据
- nativescript-angular - 在 nativescript radlistview 过滤中显示自定义消息
- asp.net - asp.net webform中的案例查询sql命令
- scala - 用于删除第一个或最后一个元素的最有效的可变集合