Ruby - Window命令行界面

时间:2012-11-30 19:57:58

标签: ruby windows command-line

更新 - 我尝试使用Python完全相同的东西,它完美地工作!!

import os
os.system('certutil.exe -v -getkey "614D628A00000000014C" C:/Users/kra/kevin')

有人可以对这个问题有所了解吗!

如果我运行这个ruby代码:

require 'open3'
stdin, stdout, stderr = Open3.popen3('certutil -v -getkey "614D628A00000000014C" C:/Users/kra/kevin')            
puts stdout.read

我收到以下错误:

Querying WIN-3CF41NBPT85.demo.com\demo-CA
CommonName: 614D628A00000000014C
CertUtil: -GetKey command FAILED: 0x80092004 (-2146885628)
CertUtil: Cannot find object or property.

但是,如果我直接从命令行运行命令,它就可以工作。

C:\Users\kra>certutil -getkey "614D628A00000000014C" C:/Users/kra/kevin
Querying WIN-3CF41NBPT85.cjndemo.com\cjndemo-CA.....................

"WIN-3CF41NBPT85.demo.com\demo-CA"
  Serial Number: 614d628a00000000014c
  Subject: CN=Kevin, C=GB
   NotBefore: 11/30/2012 10:20 AM
   NotAfter: 5/7/2013 9:29 AM
  Template: Copy of Web Server
  Version: 3
  Cert Hash(sha1): 88 b1 7a 74 8c be 73 d5 16 07 7f 19 16 57 14 c5 dd a9 79 7f


Recipient Info[0]:
CMSG_KEY_TRANS_RECIPIENT(1)
CERT_ID_ISSUER_SERIAL_NUMBER(1)
    Serial Number: 129e45d3000000000130
    Issuer: CN=demo-CA, DC=demo, DC=com
    Subject: CN=kra, CN=Users, DC=demo, DC=com
CertUtil: -GetKey command completed successfully.

有趣的是,如果我运行这个ruby代码: -

require 'open3'
stdin, stdout, stderr = Open3.popen3('certutil -recoverkey -p lexicon C:\Users\kra\kevin C:\Users\kra\kevin.pfx')
puts stdout.read

它也有效。

Computed Hash: 6e d3 b8 ad 93 16 7b f0 fb b3 f5 cd 7e e4 bb ad fb 95 a0 81

User Certificate:
    Serial Number: 614d628a00000000014c
    Issuer: CN=demo-CA, DC=demo, DC=com
    Subject: CN=Kevin, C=GB
    Cert Hash(sha1): 88 b1 7a 74 8c be 73 d5 16 07 7f 19 16 57 14 c5 dd a9 79 7f
CertUtil: -RecoverKey command completed successfully.

我假设它有某种奇怪的环境因素,因为显然ruby能够调用certutil.exe命令吗?

1 个答案:

答案 0 :(得分:1)

Open3.popen3的第一个参数是您要传递给子命令的环境。我不得不用它来按照我的预期让事情发挥作用:

Open3.popen3(ENV, 'command') { ... }

将当前脚本的环境传递给子命令。当前脚本将从命令行继承其环境,因此,理论上,子命令将具有与命令行发出的命令相同的信息。

如有必要,您还可以在调用popen3之前提取ENV的子集,或临时覆盖变量。


而不是popen3,请尝试使用capture3。它非常相似,但我认为它有点不那么低级了。我已经看到popen3 capture3的一些奇怪的行为,ENV很好地避免了。另外,请注意您可以传递{{1}}。