Applescript med ssh-tunnlar och thunderbird.

Tråden skapades och har fått 23 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Kristianstad
  • 2008-07-18 23:08

Hej.
Jag sitter och försöker lära mig applescript. Jag har kommit en bra bit på vägen men sedan har jag fastnat... Kanske någon som kan hjälpa mig. Jag har en macbook pro och ansluter till olika nätverk således vill jag att mitt script skall ansluta mot olika portar med ssh beroende på vilket nät jag sitter på. När jag kör scriptet så startat thunderbird och den ansluter med ssh till de servrar jag skall ansluta mot det som jag inte har klurat ut är att när jag avslutar thunderbird så stängs inte mina sessioner ner (terminalen) utan den måste jag då växla till och logga ut manuellt...

Ytterligare en fråga efter att applescript går in i en sub-rutin (on configure) skall den inte hoppa ur den och fortsätta där den slutade innan rutinen??? Jag var nämligen tvungen att lägga Tell Application "Thunderbird" i början annars startade den inte...

Finns det någon lösning på mitt problem på ett relativt lätt sätt??

Bifogar mitt script här modifiera det gärna och kom med kommentarer. Som sagt var så är jag nybörjare på detta...

set AirportName to do shell script ¬
"system_profiler SPAirPortDataType | grep -i curr | awk '{print $4}'"
--"system_profiler SPAirPortDataType|awk -F\": \" '/Current Wireless Network/{print $2}'"
tell application "Thunderbird"
activate
end tell
if AirportName is "AirPort" then
set AirportName to ""
set val to "AirPort"
set menytext to "Du är inte ansluten"
global menytext
meny(AirportName, menytext)
end if
if AirportName is "a3m" then
set val to "Hemma"
set menytext to "Du är ansluten till "
global menytext
configure(val)
end if
if AirportName is "other" then
set val to "other"
set menytext to "Du är ansluten"
global menytext
configure(val)
else

set menytext to "Du är ansluten till "
meny(AirportName, menytext)
end if

on configure(val)
if val is "other" then
global kommando
set window_name to "SSH..."
set kommando to "ssh tunnel 1"
ssh(kommando)
set kommando to "ssh tunnel 2"
ssh(kommando)
else if val is "Hemma" then
global kommando
set window_name to "SSH..."
set kommando to "ssh tunnel 3"
ssh(kommando)
set kommando to "ssh tunnel 4"
ssh(kommando)
else if val is "Hotell" then
global kommando
set window_name to "SSH..."
set kommando to "ssh tunnel 5"
ssh(kommando)
set kommando to "ssh tunnel 6"
ssh(kommando)
else if val is "other1" then
global kommando
set window_name to "SSH..."
set kommando to "ssh tunnel 7"
ssh(kommando)
set kommando to "ssh tunnel 8"
ssh(kommando)
end if
error number -128
end configure

on meny(AirportName, menytext)
global val
set Listan to {"other", "Hemma", "Hotell", "other1"}
set dialogResult to choose from list Listan with prompt "Auto detect were not able to set" with title menytext & AirportName OK button name "Anslut" cancel button name ¬
"Avbryt"

if dialogResult is false then

error number -128
end if
if the dialogResult is not true then
set val to item 1 of the dialogResult
end if
configure(val)
end meny

on ssh(kommando)
tell application "iTerm"
--activate
if (count of terminal) = 0 then make new terminal
end tell

tell application "iTerm" to tell first terminal
launch session "Default"
tell last session
write text kommando
set name to kommando
set foreground color to "black"
set background color to {41000, 49000, 55000}
end tell
end tell
end ssh

Varför man måste använda tell nämnde jag i detta inlägg:

99.se - Visa inlägg - Applescript, behandla output från shell script

En annan liknade grej, som gäller "handlers" är att om du så att säga pratar med en "hantverkare" redan (tex är inne i en Tell application Finder) så kan du behöva använda "tell me" just för att få ditt script att snacka med en handler lite längre ner.

Lära dig mer applescript? Googla fram Applescript Languge Guide, en tjockis PDF-fil. Vi har här på 99.se också massor med trådar om Applescript och guider mm.

  • Medlem
  • Kristianstad
  • 2008-07-20 21:01

Mja, det var inte riktigt det jag sökte...

1. När jag avslutar Thunderbird så vill jag att min terminal avslutas (stängs).
2. När en "on funktion" avslutas skall inte då den fortsatta exekveringen utföras på den plats där anropet skedde ifrån?

//Magnus

Det beror på vad som sker inne i handlern.

  • Medlem
  • Kristianstad
  • 2008-07-23 00:15

Hej.
Jag förstår inte riktigt det där med handlers.. Men jag bifogade mitt lilla script och tänkte då i min enfald att de som kan och naturligtvis vill hjälpa mig då ser vad som är tanken att ske.
Så som i mitt fall så sitter jag hemma och då skall ju den gå in i "hemma" (a3m)
där anropas funktionen configure som i sin tur anropar ssh funktionen. Där dessa är färdiga så "borde" den då fortsätta med nästa rad dvs..
if AirportName is "B2_private_5F" then ...

i mitt sinne så skulle jag kunna lägga till efter sista else (precis ovan configure funktionen tell application "Thunderbird".

Gör jag det så startat inte thunderbird...

Tänker jag så galet eller????

De som kan hjälpa dig är de som har Thunderbird och iTerm installerat, har man inte det och vill hjälpa till måste man leta rätt på dem på nätet, ladda hem och installera dem först, då först kan man kompilera ditt script. Ledsen kompis men det hinner jag inte göra.

Nästa steg om man vill hjälpa dig är att leta rätt på vad som möjligtvis kan vara fel med scriptet utifrån din beskrivning. Jag förstår tyvärr inte vad du menar att problemet är utifrån din beskrivning och du har inte med några felmeddelanden heller eller och ditt script är långt och därför har jag valt att hjälpa dig med att ge dig pekare i förhoppningsvis rätt riktning.

Så om du inte upplever att du har fått den hjälp du velat få, så måste du fundera över hur du kan underlätta för den som vill hjälpa dig så att de måste göra en så liten ansträngning som möjligt, det brukar nämligen leda till flera svar. Tex ange vilka felmeddelanden du får, eller lägga in grejer i ditt script så att du vet vilken del av det som inte exekeveras. (se i slutet på detta inlägg).

Applescript är väldans enkelt att lära sig till en gräns, men efter den gränsen som är just globala variabler och handlers så får man fundera lite mera. Du beskriver dig som en nybörjare och jag har förstås inte tid att förklara allt du behöver veta om handlers för att du skall kunna då ditt script att fungera, speciellt inte i ett foruminlägg.

I korthet fungerar alla applescript så att du måste (som jag poängterade med att länka till en tråd där jag säger det) "säga" ditt kommando till rätt grej, det är det som kallas för handlers.

Om du använder handlers, vilket du gör (on menu tex) så betyder det i min liknelse att du skapat nya hantverkare förutom Thunderbird och iTerm som redan finns i tellkommandon i ditt script och det är just här som nybörjare brukar göra fel. Man fattar inte det där med hantverkare.

Handlers i korthet: De styr vilket hantverkare man pratar med och med handlers så kan man även bygga ett script som jobbar med subrutiner, vilket du försöker göra men inte riktigt lyckas med.

För att svara på din fråga om hur Applescript hoppar:

Har du ett script så här:

Applescriptkommando1
Applescriptkommando2
tell application någonting
   Programkommando 1
   Programkommando 2
end tell
do handler(mojäng, pryttel)
Applescriptkommando1
tell application någotannat
   programkommando 3
do handler (manick) <-- fel
end tell

Så fungerar inte det. Har du väl börjat med handlers så bör du ha det även för scriptet i början, och ha en on run för att dela in den biten av scriptet som är huvuddelen i det hela, så att dina subrutiner kommer för sig efteråt:

on run
   kommando
   kommando
   kommando
   ropapåhandler
end run

För att svara på din fråga om hur Applescript hoppar, jo självklart fortsätter Applescript att processa från den punkt när den hoppade till en handler, men inte om handlern innehåller någon typ av error-"sättande" eller avbryt-kommando, vilket ju ditt script verkar göra?

Du kan kan göra så här:

-- Applescriptkommando:
set minVariabel to 345
set minVariabel to MultipliceraMedFem(minVariabel) -- Detta hoppar till handlern och gör något och forsätter sedan härifrån.
--> Returnerar 1725
set minVariabel
-- Returnerar 725

-- Handler
on MultipliceraMedFem(nummer)
	set nyttnummer to nummer * 5
	return (nyttnummer)
end MultipliceraMedFem

Detta är ett sätt att hantera handlers, att låta handlern returnera något och lagra det i variabler. Detta brukar vara bättre än globala variabler, som du också kan läsa på om i Applescript Language Guide (uppdaterad den 11 mars 2008, vilket är nio år sedan förra gången). Du kan också läsa på om properties, vilket är ett sätta att lagra variabler inuti en script-fil.

Här är ett vanligt fel

tell application "Finder"
	set minVariabel to 345
	set minVariabel to MultipliceraMedFem(minVariabel) -- Här är felet, denna rad går inte att kompilera
end tell

-- Handler
on MultipliceraMedFem(nummer)
	set nyttnummer to nummer * 5
	return (nyttnummer)
end MultipliceraMedFem

Felet är just det jag pratade om, hantverkare. Om du är inuti ett tell app Finder och där säger till den MultipliceraMedFem så fattar inte hantverkaren Finder vad du pratar om.

Det finns flera sätt runt det, här är två av dem:

Ändra raden:
set minVariabel to MultipliceraMedFem(minVariabel)

till...
set minVariabel to MultipliceraMedFem(minVariabel)of me

eller ändra raden
set minVariabel to MultipliceraMedFem(minVariabel)

till...
tell me
set minVariabel to MultipliceraMedFem(minVariabel)
end tell

Du bör även testa och laborera med handlers separat så att du förstår hur de fungerar innan du börjar bygga ditt script (använd sådana exempel jag har ovan). Du behöver också lära dig vanliga felsökningsmetoder för att se vart scriptet springer och huruvida olika tell-satser och villkor faktiskt utförs. Du kan använda tex dessa:

beep 3

eller

display dialog "Nu är jag här"

Lycka till!

Hur gick det med detta?

Förresten, vill du se lite exempel på hur man kan jobba med handlers mm så postade jag just ett script här:

http://www.99.se/grafisk-produktion/247686-applescript-f-r-att-processa-bilder-till-best-mda-bredder-f-r-tex-bloggar-tryck-mm.html

  • Medlem
  • Kristianstad
  • 2008-07-28 23:13

Gudars vad du har skrivit..
Jag har varit iväg på en liten semester.....

Jag tackar enormt mycket för dina tips... -Mycket bra!!!
Jag har labbat lite fram och tillbaka och konstaterat att Thunderbird ej har något direkt stöd för apple script. Jag gör precis som du skrev med att skapa små enkla script för att testa olika funktioner vilket är ett mycket bra sätt att jobba sig vidare med kunskapen.
Jag börjar förstå det här med hantverkarna... Men jag måste ta och läsa vidare i guiden helt klart. Det får bli höstens projekt!!! Nu när vädret är fint så blir det friggebod byggande istället så man får plats i garaget....

Jag kanske inte var så tydlig eftersom du inte förstod mitt problem direkt.
Jag får inte något felmeddelande. Det är bara det att jag skulle vilja fånga upp "singalen" att thunderbird stängs. Det borde finnas en "hake" att fånga upp och då köra ett sk. avslut script...
1 script "mitt nuvarande" startar ssh-tunnlar samt thunderbird.
---- jag läser mina e-post---- tiden går
---- jag stänger thunderbird -- (signalen)
2 ett avslutande script startas och stänger mina ssh-sessioner...

Så med andra ord script 1 är klart

Det var "signalen" som startar script 2 som jag letar efter.

Jag har/använt ett shell script tidigare typ...

#/bin/sh
ssh -L port:dst-ip:143 ip-epost.server &
echo $? > mail.pid
ssh -L port:dst-ip:143 ip-epost.server2 &
echo $? >> mail.pid
thunderbird
kill `cat mail.pid`

Detta är en lite förenklad variant av mitt shell script

Det öppnar "standart terminalen" med 2 fönster med resp. tunnlar i dem.

Sen började jag titta på apple script och tänkte att kanske jag kunde bli av med de irriterande terminal fönstren....

  • Medlem
  • Kristianstad
  • 2008-07-28 23:16

Glömde kommentera (du kanske redan vet) men & efter ssh sessionen "forkar" processen
därmed körs scriptet vidare men stannar vid thunderbird...
Först när jag avslutar thunderbird så kör scriptet vidare...

Egentligen är det just det jag vill åstadkomma med applescript...

stanna och invänta avslut på prg....

Har du sett detta (appropå att du verkar vilja skicka terminalkommandon, vet du att man kan göra det direkt med Appelscript)?

Technical Note TN2065: do shell script in AppleScript

och detta (Applescript Language Guide är uppdaterad för Mac OS X 10.5)?

AppleScript Language Guide: Introduction to AppleScript Language Guide

  • Medlem
  • Kristianstad
  • 2008-07-29 23:32

Japp, jag har sett dem bägge 2. Jag har använt lite av den kunskapen som fanns i do shell script... Dock har jag inte lusläst de omfattande dokumenten....

Men lite då och lite då... så börjar man förstå tanken bakom de olika kommandona och själva uppbyggnaden av script "tänket". Det skiljer sig markant mot shell som jag har pysslat en hel del med.

När jag läste igenom dina exempel igen så fastnade jag på of me som man skulle ändra det till...

är "me" någon inbyggd egen funktion eller vad är me????

Du skrev:
Ändra raden:
set minVariabel to MultipliceraMedFem(minVariabel)

till...
set minVariabel to MultipliceraMedFem(minVariabel) of me

eller ändra raden
set minVariabel to MultipliceraMedFem(minVariabel)

till...
tell me
set minVariabel to MultipliceraMedFem(minVariabel)
end tell

Du kanske inte orkar förklara för mig och det är ok i så fall... Jag menar det finns ju en höst på intågande som man kan nyttja till att läsa....

me är scriptet, eller snarare någon annanstans i scriptet.

Vi håller oss kvar i liknelsen, ett script pratar med olika hantverkare:

tell snickare
alla
kommandon
här
går
till
snickaren
end tell

on målanågot ()
alla kommandon här går till målaren
end målanågot

Dess två scriptdelar sitter just nu inte ihop, de bara står i samma. Målanågot utförs aldrig.

Vad man ofta gör om man har ett sådant script som ovan är att snickaren behöver fråga målaren något, dvs inuti tell snickare

tell snickare
snickare skruvar
snickare spikar
målanågot()
skruva lite mera
end tell

Eftersom man är inuti ett tell snickare så är det snickaren som får kommandot målanågot, dvs inte alls "on målanågot" lite längre ner i samma script. Så länge du är innanför tell så är det snickaren som blir tillsagd allting.

Det är därför man skriver tell me eller of me som betyder ungefär, säg det här till någon annan hantverare på "bygget", leta rätt på honom själv, han är här någostans i scriptet/bygget.

Tydligare nu?

Testa mina exempel i Manusredigeraren, du får "rätt" felmeddelanden när du glömmer me.

Jag läste ditt inlägg nr 8 lite noggrannare, jag skummade det tidigare mitt i natten..

Även om ett program inte har stöd för Applescript, så kan man med Applescript säga åt det att starta och avsluta.

Du skulle alltså kunna skapa ett script som heter Avsluta Thunderbird och SSH som innehåller ungefär detta:

try
  tell application "Thunderbird"
    quit
  end tell
end try

-- Skicka dina kommadon som stänger SSH här, men använd do shell script
do shell script "lalala1"
do shell script "lalala2"
do shell script "lalala3"

Spara det sedan som ett program någonstans. Du kan göra ett motsvarande script som istället startar Thunderbird och spara det som ett program. Lägg sedan ikonen för dessa i dockan, så har du en arbetsmiljö för att starta Thunderbird (klicka på Thunderbird-ikonen, öppnar SSH-tunnlarna eller vad det nu heter ), avsluta Thunderbird (klicka på ikonen precis till höger, stänger SSH-tunnlarna).

Ungefär så?

  • Medlem
  • Kristianstad
  • 2008-08-02 00:07

Mmmm visst det har helt rätt i det. Fast det känns lite omständigt att behöva ha 2 applescript + ett eller flera shell script som hanterar "do shell" etc....

Vet du inte om det går att fånga "signalen" kanske via system events "thunderbird has closed" eller ngt....

Tycker du verkligen att det är omständligt att klicka på en ikon i dockan?

Om jag räknar antalet scripts enligt vad du säger verkar det som om du tror att du behöver två applescript och flera shellscripts, dvs totalt fyra, sex eller något liknande. Kanske du missförstod mig, jag menade att du har sammalagt två applescript. Ett startar Thunderbird och öppnar tunnlarna och ett till som avslutar Thunderbird och stänger tunnlarna. Det bygger på att de sammalagt två scripten har kommadot do script som alltså öppnar och stänger tunnlarna. Vet inte om det går att få enklare än så, åtminstone inte förräns den egna hjärnan kan fås med USB-koppling?

  • Medlem
  • Kristianstad
  • 2008-08-08 22:39

hahahahah - usb-koppling.
idag har jag en ikon som jag startar mitt mail med. när jag då avslutar thunderbird så stängs tunnlarna med automatik via mitt shell-script. Det verkar som jag får ha det på det viset tills jag har tid med att sätta mig in i vad applescript är kapabelt till att göra. Det måste bara gå att "fiska" upp när ett program stängs och då utföra en åtgärd. Men som nuläget är så känner varken du eller jag till denna funktion så jag får nog nöja mig med det shellscript som jag har och fungerar med sina synliga terminaler.

Det har varit en trevlig diskussion här och jag tackar än en gång för givande svar

Vi snackas säkert vidare senare...
//Magnus

Du kan leka med detta manus, spara det som program och kryssa för "Lämna öppet".

Det fungerar så att det kollar om programmet Skype har avslutats (man kan inte starta programmet utan att det är igång, för då avslutar det direkt, så alltså bör detta script kompletteras med programkod som först startar Skype). Om Skype inte är igång längre, så avslutas även iChat och Adium och även detta script. Om Skype ÄR igång så händer inget annat än att det går 10 sekunder innan det kollar igen, osv...

tell application "System Events"
	
	repeat
		
		set isSkypeRunning to count (every process whose name is "Skype")
		-- creator type fungerar också, för tex Skype är det "SKYP"
		
		if isSkypeRunning = 0 then
			exit repeat
		end if
		
		delay 10 -- seconds
	end repeat
	
	-- Do stuff here if Skype is not running like....
	
	try
		tell application "Adium"
			quit
		end tell
		tell application "iChat"
			quit
		end tell
	end try
	
	quit -- (This app)
	
end tell
  • Medlem
  • Karlstad
  • 2008-08-14 11:37

Jag vet inte riktigt vad som ska uppnås, men tänkte ändå tipsa om MarcoPolo (MarcoPolo - Context-aware computing for Mac OS X). Det kanske kan hjälpa med något?

Senast redigerat 2008-08-14 23:56
  • Medlem
  • 2009-09-04 07:28
Ursprungligen av Taz_1999:

Du kan leka med detta manus, spara det som program och kryssa för "Lämna öppet".

Det fungerar så att det kollar om programmet Skype har avslutats (man kan inte starta programmet utan att det är igång, för då avslutar det direkt, så alltså bör detta script kompletteras med programkod som först startar Skype). Om Skype inte är igång längre, så avslutas även iChat och Adium och även detta script. Om Skype ÄR igång så händer inget annat än att det går 10 sekunder innan det kollar igen, osv...

tell application "System Events"
	
	repeat
		
		set isSkypeRunning to count (every process whose name is "Skype")
		-- creator type fungerar också, för tex Skype är det "SKYP"
		
		if isSkypeRunning = 0 then
			exit repeat
		end if
		
		delay 10 -- seconds
	end repeat
	
	-- Do stuff here if Skype is not running like....
	
	try
		tell application "Adium"
			quit
		end tell
		tell application "iChat"
			quit
		end tell
	end try
	
	quit -- (This app)
	
end tell

Jag har lärt mig att idle-handlers är lämpligare än evihetsloopar.

  • Medlem
  • Kristianstad
  • 2008-08-14 22:10

Tackar för koden Taz!!! Jag har precis bytt jobb och det är skolstart i faggorna..... Så min tid just nu och några veckor fram är ytterst begränsade. Men jag har redan sparat scriptet för senare funktion... Jag tror helt klart att det är ungefär så jag vill ha det.... även om det inte blir direkt utan efter som max 10 sek.... Men det är ju bara till att justera....

Jag tror det blir super bra eller i alla fall fullt användbart, kanske inte en snygg men dock en fungerande lösning på mitt problem.

  • Medlem
  • Kristianstad
  • 2008-08-14 22:13

Till dig Mojje...
Länken finns inte.... publicera en länk som fungerar...
www.symonds.id.au
MarcoPolo - Context-aware computing for Mac OS X)
You have requested a page or object that was not found on the server. This may be the result of a typo or broken link.

Error 404 Not Found (File does not exist: /marcopolo/))

Mojje skrev inte ett mellanslag mellan sista tecknet i URL'en / och ), det är det enda du behöver radera för att länken skall fungera. Vanligt misstag.

Kul att koden var användbar, den grejen Mojje länkar till verkar kunna "känna av" att ett program avslutas, men jag orkade inte läsa exakt hur och om du kan använda detta på ditt problem. Kanske i kombination med vad vi diskuterat ovan.

Senast redigerat 2008-08-15 10:21
  • Medlem
  • Kristianstad
  • 2008-08-19 21:29

Ok... Du har så rätt så...Men det var inte det jag ville.... Men en häftig sak annars
//M

1
Bevaka tråden