【问题标题】:heroku certs:info --app appname does not write to STDOUT or STDERRheroku certs:info --app appname 不写入 STDOUT 或 STDERR
【发布时间】:2013-10-20 14:44:12
【问题描述】:

我正在尝试处理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

这是一个应该报告的错误还是我遗漏了什么?

【问题讨论】:

  • 我相信我已经找到了答案。该脚本直接打开 /dev/tty 并绕过 STDERR/STDOUT/STDIN。在这里找到了答案:unix.com/shell-programming-scripting/… 我可以看到一些证书信息不应该被捕获。

标签: heroku heroku-toolbelt


【解决方案1】:

我同样试图捕获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"

-n 选项将使 curl 使用 heroku 脚本已经使用的 ~/.netrc 条目。输出采用 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 输出更易于解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-15
    • 2016-11-03
    • 2019-08-21
    • 1970-01-01
    • 2016-09-30
    • 2019-12-11
    • 1970-01-01
    相关资源
    最近更新 更多