Рубиновый способ обработки команды оболочки, которая вызывает защищенное окно MacOS - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть простая проблема, с которой я хотел бы увидеть, могут ли люди, которые здесь помогают. В настоящее время я пишу некоторую автоматизацию тестирования для обработки простого встроенного инструмента командной строки, который выводит содержимое смарт-карты. В процессе сброса этой информации о смарт-карте он вызывает окно ввода PIN-кода, которое пользователю необходимо будет ввести в свои данные PIN-кода для разблокировки смарт-карты. Проблема, с которой я сталкиваюсь, состоит из двух частей.

  1. Как вы справляетесь с таким всплывающим окном в ruby? Это сделано через rb_appscript? или что-то подобное? И если это возможно (что я не смог выяснить), как получить идентификатор, имя и т. Д. Этого окна, а затем перехватить событие ввода текста? кажется очень сложным.

  2. Этот случай действительно сбывается только тогда, когда у вас есть «несколько» окон PIN для обработки. Для карт CAC существует одно событие разблокировки PIN-кода, которое легко обрабатывается в начале скрипта простой цепочкой ключей cli, называемой «security»:

Это событие:

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

При вызове до сброса карты разблокировка цепочки для ключей и сброс карты без запроса PIN-кода.

Однако, если карта является картой PIV, в токене, по-видимому, есть ошибка, которая представляет еще 4 запроса PIN-кода для сертификатов в карте. Таким образом, приведенная выше команда будет работать только для одного события разблокировки. Я попытался отправить 4 события разблокировки подряд, но это не помогло. Что я застрял с окном ввода PIN-кода, которое выглядит так:

enter image description here

Мне любопытно, как можно было бы обработать это действие в Ruby, можно ли это сделать с помощью rb_appscript другого гема ruby, о котором я не знаю? Не могли бы вы нарезать это?

Вот мой код, простите за жесткое кодирование, но сейчас я просто издеваюсь:

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

Я смотрел на гем 'session' и некоторые другие интерактивные гемы оболочки, но они, похоже, не в состоянии справиться с этой проблемой. Если бы я мог найти способ обработать это окно внутри моего рубинового кода, это хотя бы позволило мне взломать все подсказки ПИН-кода? или иметь цикл, который ищет эти всплывающие окна, вводит PIN-код для карты в этом всплывающем окне, по крайней мере, я обработаю это.

Любая помощь здесь будет принята с благодарностью.


Мне кажется, я понимаю, что вы говорите ... но поскольку это параллельный процесс, то есть событие должно быть захвачено, я не уверен, что это:

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

будет работать, так как запущен один процесс ruby. Я думаю, я мог бы поставить его в цикл и искать окно таким образом? Однако не совсем уверен

1 Ответ

0 голосов
/ 20 сентября 2011

Вы не можете использовать Appscript, если приложение явно не делает доступной функцию AppleScript, в этом я сильно сомневаюсь.Вы можете открыть редактор AppleScript и просмотреть библиотеку своего приложения, чтобы увидеть все функции, которые оно делает доступными.В вашем случае вам, вероятно, понадобится что-то вроде Keyboard Maestro, которое может имитировать ввод с клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...