【问题标题】:Ruby way of handling shell command that evokes a MacOS securityd windowRuby 处理调用 MacOS 安全窗口的 shell 命令的方式
【发布时间】:2011-11-12 13:43:45
【问题描述】:

我有一个简单的问题,我想看看这里的人是否可以帮助我。目前,我正在编写一些测试自动化来处理一个简单的内部命令行工具,该工具可以转储智能卡的内容。在转储此智能卡信息的过程中,它会调用一个 PIN 输入窗口,用户需要在该窗口中输入其 PIN 码信息以进行智能卡解锁。我遇到的问题有两个。

  1. 如何在 ruby​​ 中处理这样的弹出窗口?这是通过 rb_appscript 完成的吗?或类似的东西?如果这是可能的(我无法弄清楚),如何获取该窗口的 id、名称等,然后捕获文本输入事件?似乎很难。

  2. 这种情况只有在您需要处理“多个”PIN 窗口时才会发生。对于 CAC 卡,有一个解锁 PIN 事件,可以在脚本的早期通过一个名为“security”的简单钥匙串 cli 轻松处理:

本次活动:

security unlock-keychain -p "12345678" "CAC-4070-4443-223E-5555-2187"

如果在转储卡之前调用将解锁钥匙串并转储卡而不提示 PIN 码。

但是,如果该卡是 PIV 卡,则令牌中似乎存在一个错误,该错误会在卡内显示另外 4 个 PIN 提示以获取证书。所以上面的命令只对一个解锁事件有效。我尝试连续发送 4 个解锁事件,但似乎无法处理。我遇到的 PIN 输入窗口如下所示:

我很好奇如何在 Ruby 中处理此操作,这可以通过我不知道的另一个 ruby​​ gem 的 rb_appscript 来完成吗?你能把这个串起来吗?

这是我的代码,请原谅硬编码,但我现在只是在嘲笑:

require "open3"

complex_switch = ["-D","-k", "--pkinit"]

id = "9999999999@mil"
pin = "1234567"

# PIV is problem child
piv_keychain = "PIV-ONCE.UPON.9999999999"
cac_keychain = "CAC-9999-9999-9999-0000-9999"

#complex switch smartcard iteration
complex_switch.count.times do |i|
  command = 'security unlock-keychain -p '+pin+' '+cac_keychain+' |sctool '+complex_switch[i]+' '+id
  io_bad = Open3.popen3(command){|stdin, stdout, stderr|stderr.read}
  io_good = Open3.popen3(command){|stdin, stdout, stderr|stdout.read}
   file = "/Users/wqc/Desktop/output/sc_switch"+complex_switch[i]+".txt"
  File.open(file, 'a') do |f|  
    f.print io_bad
    f.print io_good
  end
end

我正在查看 gem 'session' 和其他一些交互式 shell gem,但它们似乎无法处理这个问题。如果我能找到一种方法来处理我的 ruby​​ 代码中的那个窗口,那至少可以让我破解所有的 PIN 提示?或者有一个循环来查找这些窗口弹出窗口,在该弹出窗口中输入卡的 PIN 码,我至少会处理这个问题。

我们将不胜感激。


我想我明白你在说什么.. 但是由于这是一个并行过程,即事件需要被捕获,我不确定这个:

tell application "Keyboard Maestro Engine"
  do script "Name of Your Macro"
end tell

会起作用,因为一个 ruby​​ 进程正在运行。我想我可以把它放在一个循环中并以这种方式查找窗口?但是,不太确定

【问题讨论】:

  • 请在个别答案下使用 cmets 进行评论,或编辑您的问题以根据需要提供额外的说明。答案就是为此而保留的,答案。 Stack Overflow 不像典型的论坛那样工作:)

标签: ruby bash macos rb-appscript sourceforge-appscript


【解决方案1】:

您不能使用 Appscript,除非应用程序明确提供 AppleScript 函数,在这种情况下我非常怀疑。您可以打开 AppleScript 编辑器,然后查看应用程序的库,以查看它提供的所有功能。在您的情况下,您可能需要类似 Keyboard Maestro 之类的东西,它可以模拟键盘输入。

【讨论】:

  • 感谢您的来信。但是,这个“键盘大师”是否有 ruby​​ cli 或我可以在命令行上调用的东西?这真的是我需要的,而不是另一个用来发送事件的 GUI,比如自动机,我确信它也可以工作?
  • 其实,我想我明白你在说什么.. 但是由于这是一个并行过程,即需要捕获事件,我不确定这个:告诉应用程序“ Keyboard Maestro Engine" do script "Name of Your Macro" end tell 将起作用,因为一个 ruby​​ 进程正在运行。我想我可以把它放在一个循环中并以这种方式寻找窗口?但是,不太确定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多