dou7466 2018-12-17 01:09 采纳率: 0%
浏览 367

在golang中执行echo和openssl命令

I'm trying to read remote website ssl cert with this cli command openssl s_client -connect www.yahoo.no:443 2> /dev/null | openssl x509 -noout -enddate | cut -d = -f 2.

This works fine in cli, but when I execute it in golang:

package main

import (
    "bytes"
    "log"
    "os/exec"
    "time"
)

func main() {
    cmd := exec.Command("echo", "| openssl s_client -connect www.yahoo.com:443 2> /dev/null | openssl x509 -noout -enddate | cut -d = -f 2")
    var out bytes.Buffer
    cmd.Stdout = &out
    err := cmd.Run()

    log.Println(out.String())
}

I get nothing in return. How can I run this command in go?

UPDATE:

this is what I've tried but no success

func command() {

    cmd1 := exec.Command("openssl", "s_client", "-connect", "www.yahoo.no:443", "2>", "/dev/null")
    cmd2 := exec.Command("openssl", "x509", "-noout", "-enddate")

    var out bytes.Buffer

    reader, writer := io.Pipe()
    cmd1.Stdout = writer
    cmd2.Stdin = reader

    cmd2.Stdout = &out

    cmd1.Start()
    cmd2.Start()

    cmd1.Wait()
    writer.Close()

    cmd2.Wait()
    reader.Close()

    io.Copy(&out, reader)
    log.Println(out.String())

}

I get empty response.

  • 写回答

1条回答 默认 最新

  • douhutongvm382381 2018-12-17 12:23
    关注

    Go's standard library contains a perfectly capable TLS implementation, so there is really no reason to launch two hefty openssl processes:

    package main
    
    import (
        "crypto/tls"
        "fmt"
        "log"
        "net"
        "time"
    )
    
    func main() {
        conn, err := net.Dial("tcp", "example.com:443")
        if err != nil {
                log.Fatal(err)
        }
    
        client := tls.Client(conn, &tls.Config{
                ServerName: "example.com",
        })
        defer client.Close()
    
        if err := client.Handshake(); err != nil {
                log.Fatal(err)
        }
    
        cert := client.ConnectionState().PeerCertificates[0]
        fmt.Println(cert.NotAfter.Format(time.RFC3339)) // Output: 2020-12-02T12:00:00Z
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 全志H618ROM新增分区
  • ¥20 jupyter保存图像功能的实现
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况