[英]How to run this command via Go?
echo "test_metric:20|c" | nc -v -C -w 1 host.address port
I run this command through terminal, I get the desired result.我通过终端运行这个命令,我得到了想要的结果。 But how can I do the same via Go code?
但是我怎样才能通过 Go 代码做同样的事情呢?
I tried this, after going through an answer here-我试过这个,在这里经过一个答案后 -
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()
But no luck.但没有运气。
I do not see the point in calling the shell to do this:我看不出调用 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!")
}
}
Start a netcat listener on one shell:在 shell 上启动一个 netcat 监听器:
$ nc -k -l 10000
run the code via通过运行代码
$ go run dacode.go
and you should see your payload on the output of the netcat listener.您应该在 netcat 侦听器的 output 上看到您的有效负载。
In case you want to transfer the output of a program to the remote server, simply call the according command via os.Exec and use io.Copy on con
and the io.Reader returned by your command's StdoutPipe() .如果您想将程序的 output 传输到远程服务器,只需通过os.Exec调用相应的命令并使用io.Copy on
con
和ZF98ED07A4D5F50F7DE1410D905F14返回的命令
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.