2016-06-10 4 views
1

Je travaille sur un Applescript pour faciliter la connexion aux domaines d'authentification à 2 facteurs. Longue histoire courte, au lieu d'utiliser des retards et envoyer du texte, je voudrais interroger le contenu de la session en cours et entrer des noms d'utilisateur/mots de passe/tokencodes dès que l'invite pour eux apparaît. Heureusement, iTerm v3.X a un tas de choses AppleScript cool: https://www.iterm2.com/documentation-scripting.htmlComment puis-je récupérer le contenu d'une session iTerm avec Applescript?

Mais j'ai beaucoup de mal à lire le contenu de la session terminal. Voici ce que j'ai jusqu'à présent:

on run 
# Start or activate iTerm 
tell application "iTerm" 
    activate 

    tell the first window 
     # Create a new tab, which will create a new session inside 
     set newTab to (create tab with default profile) 
     tell newTab 
      # Since we just created the tab, there should only be one session right now. 
      repeat with aSession in sessions 
       tell aSession 
        delay 3 
        #set myvar to (tty) 
        #set myvar to (text) 
        set myvar to (contents) 
        #do shell script "echo " & myvar & " >> ~/some_file.txt" 
        #write text (contents) 
       end tell 
      end repeat 
     end tell 
    end tell 
end tell 
return myvar 
end run 

Comme vous pouvez le voir, je l'ai essayé plusieurs choses différentes, « contenu » semblait être la solution la plus prometteuse selon la documentation, mais des choses folles sort, comme ceci:

session id "0986F3BD-D2AF-480F-B517-AB7A43B2A0C4" of tab 3 of window id "window-1" of application "iTerm" 

Qu'est-ce que ce genre de choses? Pourquoi ne pas voir ce que je pense, ce qui est quelque chose comme ceci:

Last login: Fri Jun 10 18:18:22 on ttys001 
[email protected]:~|⇒ 
+0

Dans ma version item2 « Build 2.9.20160313 », votre script fonctionne très bien et obtient exactement ce que prévu. J'ai couru ce script par 'Script Editor'. –

+0

Eh bien, j'ai téléchargé cette version et je jure que j'ai eu ce script pour fonctionner 3 ou 4 fois de suite, mais dès que j'ai commencé à éditer mon script, il a recommencé à retourner des trucs fous sur l'ID de session. Je n'arrive pas à comprendre ce que je fais de mal ou ce qui ne va pas. – cgm123

+0

avez-vous exécuté votre script depuis 'Script Editor' ou d'autres façons? Je ne comprends pas la signification de 'dans une rangée' ... –

Répondre

0

Je suis arrivé que cela fonctionne pour un bon 3-5 fois de suite, mais dès que j'edited nouveau mon script, il commencé à retourner ce truc d'identification de session. À ce moment-là, j'ai décidé que l'applescript ou l'applescript d'iTerm était trop opaque. Je martelés une solution de contournement qui semble en fait assez bien travailler, ici il est pour celui qui vient après moi:

on grepCountsFor(searchString) 
    set terminalContents to my getContents() 
    log "terminal contents: " & terminalContents 

    set oneline to "" 
    set allRecords to paragraphs of terminalContents 
    repeat with aRecord in allRecords 
     if length of aRecord is greater than 0 then 
      set variable to aRecord 
      log "variable: " & variable 
      set oneline to oneline & variable 
     end if 
    end repeat 

    log "oneline: " & oneline 
    set command to "echo \"" & oneline & "\" | grep -o \"" & searchString & "\" | wc -l" 

    log "command: " & command 
    set counts to do shell script command 
    return counts as number 
end grepCountsFor 

on getContents() 
    #iTerm needs to be in the front for key presses to register. 
    my waitForWindow("iTerm") 
    # Mush buttons in the app 
    tell application "System Events" 
     keystroke "a" using command down 
     keystroke "c" using command down 
     set sessionContents to do shell script "pbpaste" 
    end tell 
    return sessionContents 
end getContents 

# Waits for a window to come into focus 
on waitForWindow(appName) 
    # Poll until "appName" is the active window 
    set activeApp to "noApp" 
    repeat until activeApp is appName 
     set activeApp to (path to frontmost application as Unicode text) 
     # If the active app name does not contain the target, 
     # try to activate it again. 
     if appName is not in activeApp then 
      tell application appName 
       activate 
      end tell 
     else 
      # Done 
      exit repeat 
     end if 
     delay 0.1 
    end repeat 
end waitForWindow