[英]How to run this command via Go?
echo "test_metric:20|c" | nc -v -C -w 1 host.address port
我通过终端运行这个命令,我得到了想要的结果。 但是我怎样才能通过 Go 代码做同样的事情呢?
我试过这个,在这里经过一个答案后 -
sh:= os.Getenv("SHELL")
cmd := exec.Command(sh, "-c ", `echo "test_metric:20|c" | nc -v -C -w 1 host.address port`)
cmd.Stdout = os.Stdout
cmd.Run()
但没有运气。
我看不出调用 shell 这样做的意义:
package main
import (
"bytes"
"flag"
"fmt"
"io"
"log"
"net"
"time"
)
var (
host string
port int
timeout string
)
func init() {
flag.StringVar(&host, "host", "localhost", "host to connect to")
flag.IntVar(&port, "port", 10000, "port to connect to")
flag.StringVar(&timeout, "timeout", "1s", "timeout for connection")
}
func main() {
flag.Parse()
// Fail early on nonsensical input.
if port < 1 || port > 65535 {
log.Fatalf("Illegal port %d: must be >=1 and <=65535", port)
}
var (
// The timeout for the connection including name resolution
to time.Duration
// The ubiquitous err
err error
// The dial string
addr = fmt.Sprintf("%s:%d", host, port)
// The actual connection
con net.Conn
// Your playload. It should be easy enough to make this
// non-static.
payload = []byte("test_metric:20|c")
)
// Check the user has given a proper timeout.
if to, err = time.ParseDuration(timeout); err != nil {
log.Fatalf("parsing timeout: %s", err)
}
// You might want to implement a retry strategy here.
// See https://stackoverflow.com/a/62909111/1296707 for details
if con, err = net.DialTimeout("tcp", addr, to); err != nil {
log.Fatalf("Error while dialing: %s", err)
}
defer con.Close()
// This simulates about every input.
// You can use a pipe of a command or whatever you want.
dummyReader := bytes.NewBuffer(payload)
if w, err := io.Copy(con, dummyReader); err != nil && w < int64(len(payload)) {
log.Printf("Short write: written (%d) < payload (%d): %s", w, len(payload), err)
} else if err != nil {
// This should not happen, as usually an error is accompanied by a short write
log.Println("Uuupsie!")
}
}
在 shell 上启动一个 netcat 监听器:
$ nc -k -l 10000
通过运行代码
$ go run dacode.go
您应该在 netcat 侦听器的 output 上看到您的有效负载。
如果您想将程序的 output 传输到远程服务器,只需通过os.Exec调用相应的命令并使用io.Copy on con
和ZF98ED07A4D5F50F7DE1410D905F14返回的命令
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.