Golang exec.Command问题

dollarkillerx
  • 43

你好,我是想让应用初始化的时候通过openssl生成 RSA 公钥和私钥
于是就想到

// 自动生成RSA公钥 私钥
func Rsa() {
// 在linux上安装好openssh不然会出错阿!
    command := exec.Command("openssl", "genrsa -out app_private_key.pem   1024")
    e1 := command.Start()
    if e1 != nil{
        panic(e1.Error())
    }
    cmd := exec.Command("openssl", "rsa -in app_private_key.pem -pubout -out app_public_key.pem")
    e2 := cmd.Start()
    if e2 != nil{
        panic(e2.Error())

}}

本人操作系统是ubuntu18.4 golang 1.12 openssl已经安装
图片描述
图片描述
编译后正常运行,且没有报错,但是没有文件生成?
我用terminal敲是有文件生成的。。。
请教以下!非常感谢

回复
阅读 5.8k
3 个回答
✓ 已被采纳

两个问题:

  1. 方法不对,Start()看内部实现用的是goroutine,也就是说,你的main没等到command执行完成就结束了。正确的应该是用Run()
  2. 根据文档,传递给的第一个参数exec.Command是可执行文件的名称,他不是由shell执行的。也就说,你的openssl并不是运行在shell环境中,参数当然也就不对了,所以正确的应该是:
exec.Command("bash", "-c", "openssl genrsa -out app_private_key.pem 1024")
exec.Command("bash", "-c", "openssl rsa -in app_private_key.pem -pubout -out app_public_key.pem")

等待结束 等待结束

Start开始执行c包含的命令,但并不会等待该命令完成即返回。Wait方法会返回命令的返回状态码并在命令返回后释放相关的资源。

cmd := exec.Command("sleep", "5")
err := cmd.Start()
if err != nil {
    log.Fatal(err)
}
log.Printf("Waiting for command to finish...")
err = cmd.Wait()
log.Printf("Command finished with error: %v", err)

以上来自 标准库

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏