简体   繁体   English

如何通过 Go 运行此命令?

[英]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 conZF98ED07A4D5F50F7DE1410D905F14返回命令

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM