3

我正在尝试处理heroku certs命令的输出。heroku 工具带中的其他命令写入 STDOUT,但heroku certs相关命令似乎heroku certs:info并没有写在我期望在 ubuntu 上的任何地方。正常运行时输出:

$ heroku certs:info --app appname
Fetching SSL Endpoint changedname-3302.herokussl.com info for appname... done
Certificate details:
Common Name(s): *.domain.com
                domain.com

...etc

尝试重定向或管道输出的输出:

$ heroku certs --app appname | grep ssl
$ heroku certs --app appname | cat
$ heroku certs:info --app appname | grep ssl
$ heroku certs:info --app appname 2>&1 | grep ssl
$ heroku certs:info --app appname &> /tmp/certs.info; cat /tmp/certs.info
$ heroku certs:info --app appname > /tmp/certs.info; cat /tmp/certs.info

其他 heroku 命令按预期工作:

$ heroku ps --app appname | grep web
=== web (1X): `node www`
web.1: idle 2013/10/12 05:44:15 (~ 10h ago)

$ heroku status --app appname | grep -i status
=== Heroku Status

这是应该报告的错误还是我缺少的东西?

4

1 回答 1

4

我同样试图捕获的输出,heroku certs以便我们可以自动化我们的 DNS 设置。

正如您还发现的,Heroku 工具带脚本不会重定向任何certs命令的输出。深入研究 ruby​​ 实现,它在“display”方法的覆盖中:

def display(msg = "", new_line = true)
  super if $stdout.tty?
end

https://github.com/heroku/heroku/blob/master/lib/heroku/command/certs.rb#L188

如果它认为它不输出到 /dev/tty,它根本不会打印任何东西。

作为快速破解,我改为使用curl等效的替代品:

curl -n -s -X GET https://api.heroku.com/apps/my_app_name/ssl-endpoints -H "Accept: application/vnd.heroku+json; version=3"

该选项将使 curl 使用脚本已经使用-n的 ~/.netrc 条目。heroku输出是 JSON 格式,沿着这些线。

[
  {
    "cname":"xxxx-xxxx.herokussl.com",
    "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name":"xxxx-xxxx",
    "warnings":[],
    "ssl_cert":{
      "ca_signed?":true,
      "cert_domains":[
        "*.xxxxxxxx.com",
        "xxxxxxxx.com"
      ],
      "expires_at":"xxxx",
      "issuer":"xxxx",
      "self_signed?":false,
      "starts_at":"xxxx",
      "subject":"xxxx"
    },
    "ssl_cert_prev":null
  }
]

根据您包装脚本的方式,这可能比heroku输出更易于解析。

于 2013-10-29T03:24:31.713 回答