Рубиновый способ обработки команды оболочки, которая вызывает защищенное окно MacOS
У меня есть простая проблема, которую я хотел бы увидеть, могут ли люди, которые здесь помогают. В настоящее время я пишу некоторую автоматизацию тестирования для управления простым инструментом командной строки, который выводит содержимое смарт-карты. В процессе сброса этой информации о смарт-карте он вызывает окно ввода PIN-кода, которое пользователю необходимо будет ввести в свои данные PIN-кода для разблокировки смарт-карты. Проблема, с которой я сталкиваюсь, состоит из двух частей.
Как вы справляетесь с таким всплывающим окном в ruby? Это сделано через rb_appscript? или что-то подобное? И если это возможно (что я не смог выяснить), как получить идентификатор, имя и т. Д. Этого окна, а затем перехватить событие ввода текста? кажется очень сложным.
Этот случай действительно происходит только тогда, когда у вас есть "несколько" окон PIN для обработки. Для карт CAC существует одно событие PIN разблокировки, которое легко обрабатывается в начале скрипта простой цепочкой ключей, называемой "безопасность":
Это событие:
security unlock-keychain -p "12345678" "CAC-4070-4443-223E-5555-2187"
Если вызывать до сброса карты, разблокирует цепочку для ключей и сбросит карту без запроса PIN-кода.
Однако, если карта является картой PIV, в токене, по-видимому, есть ошибка, которая представляет еще 4 запроса PIN-кода для сертификатов в карте. Таким образом, приведенная выше команда будет работать только для одного события разблокировки. Я пытался отправить 4 события разблокировки подряд, но это не помогло. Что я застрял с окном ввода PIN-кода, которое выглядит так:
Мне любопытно, как можно было бы обработать это действие в 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' и некоторые другие интерактивные гемы оболочки, но они, похоже, не в состоянии справиться с этой проблемой. Если бы я мог найти способ обработать это окно внутри моего рубинового кода, это, по крайней мере, позволило бы мне взломать все подсказки ПИН-кода? или иметь цикл, который ищет эти всплывающие окна, вводит ПИН-код для карты в этом всплывающем окне, по крайней мере, я это обработаю.
Любая помощь здесь будет принята с благодарностью.
Я думаю, я понимаю, что вы говорите... но поскольку это параллельный процесс, то есть событие должно быть в ловушке, я не уверен, что это:
tell application "Keyboard Maestro Engine"
do script "Name of Your Macro"
end tell
будет работать, так как запущен один процесс ruby. Я думаю, я мог бы поставить его в цикл и искать окно таким образом? Однако, не совсем уверен
1 ответ
Вы не можете использовать Appscript, если приложение явно не делает доступной функцию AppleScript, в этом я очень сомневаюсь. Вы можете открыть редактор AppleScript и просмотреть библиотеку своего приложения, чтобы увидеть все функции, которые оно делает доступными. В вашем случае вам, вероятно, понадобится что-то вроде Keyboard Maestro, которое может имитировать ввод с клавиатуры.