Montera en delning från Tunnelblick utan att köra som root
Ett AppleScript som håller sig öppet kan bevaka en Tunnelblick-profil och montera en SMB-delning som den inloggade användaren, utan root-hook eller lösenordslös sudo.
VPN-klienten behöver privilegierad hjälp för att konfigurera om nätverket, och det faktumet appliceras för brett på allt runt omkring. Ett skript som monterar en fildelning behöver inte root, eftersom delningen tillhör den inloggade användarens session och den användarens inloggningsuppgifter. Att flytta monteringen ut ur den privilegierade vägen tar bort behovet av sudo-regler, root-hooks och ändringar av medföljande program. Det som återstår är en liten applet som håller sig öppen, bevakar en profil och gör ett försök.
Därför hör detta hemma i användarsessionen
En monterad volym är en egenskap hos den session som monterade den. En annan användares session ser den inte, och en montering som ägs av root beter sig annorlunda än den Finder skapade. Att hålla monteringen i användarsessionen bevarar den semantiken.
Privilegierade hjälpare finns för de delar som verkligen behöver dem: att skapa ett tunnelgränssnitt, ändra rutter, uppdatera resolvern. Att montera en SMB-delning är inte en av de delarna. Att behandla det som om det vore det tvingar fram ett val mellan lösenordslös sudo och ett root-skript som körs när ingen är närvarande. Båda är större risker än problemet motiverar, och användarsessionsansatsen undviker valet helt.
Tunnelblicks egna anslutningshooks är ingen ersättning här, eftersom de körs utanför skrivbordssessionen och deras ordning i förhållande till klientens skript inte är definierad. Att polla tillståndet från en användarapplet är en mindre mekanism med färre antaganden.
Bevisa först för hand att delningen fungerar
Automatisering kan inte leverera en rutt, en behörighet eller ett konto som inte finns. Anslut VPN:et manuellt och öppna delningen i Finder innan du skriver något skript. Om det misslyckas kommer skriptet att misslyckas på ett mer förvirrande sätt.
Anteckna de tre värden skriptet ska använda: profilnamnet exakt som Tunnelblick listar det, delningens URL och volymnamnet som Finder visar efter monteringen. Volymnamnet spelar roll eftersom kontrollen av en befintlig montering använder det, och en kontroll som bara ser till namnet är en bekvämlighetsvakt snarare än bevis på serverns identitet. Använd ett namn som är unikt på maskinen. Bekräfta sedan att servern alls svarar.
smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs
Det första kommandot bevisar att servern svarar, det andra att profilnamnet slår upp, och det tredje visar hur en lyckad montering ser ut. Fånga alla tre innan du automatiserar något.
Läs profiltillståndet från Tunnelblick
Tunnelblick exponerar sina konfigurationer och deras tillstånd via AppleScript, och det är den enda hook detta utförande behöver. Det tillstånd du bryr dig om är strängen som rapporteras för just den profilen, inte programmets närvaro.
Pollning har konsekvenser som är värda att nämna. En återanslutning som är kortare än intervallet kan gå obemärkt förbi, och appletten ser aldrig övergången. Det är acceptabelt för en monteringsvakt och oacceptabelt för något som måste reagera på varje händelse. Om du behöver händelsetrohet är detta fel mekanism snarare än en mekanism som behöver en kortare timer. Välj intervallet med den avvägningen i åtanke.
property attempted : false
on idle
set profileName to "Office"
set shareURL to "smb://files.corp.example/OfficeTeam"
set volName to "OfficeTeam"
tell application "Tunnelblick" to set vpnState to state of first configuration whose name is profileName
if vpnState is not "CONNECTED" then
set attempted to false
return 20
end if
tell application "Finder" to set mounted to (exists disk volName)
if (not mounted) and (not attempted) then
set attempted to true
try
mount volume shareURL
end try
end if
return 20
end idle
Exportera det som ett program med alternativet att hålla sig öppet och starta det sedan i den inloggade sessionen i stället för via sudo.
Montera en gång och sluta sedan försöka
Flaggan för försökt är det som hindrar detta från att bli en loop som gissar inloggningsuppgifter. När appletten har försökt väntar den på att anslutningstillståndet ska ändras innan den försöker igen.
Det beteendet är avsiktligt. En delning som vägrar monteringen vägrar den vanligtvis av en anledning som ett nytt försök inte kan åtgärda, och upprepade försök gör en fråga till en ström av dem. Flaggan återställs när profilen lämnar det anslutna tillståndet, så en verklig återanslutning ger exakt ett nytt försök. Att avsluta och starta om appletten återställer den också, och det är den manuella åsidosättningen. Ingen av vägarna döljer ett misslyckande; båda lämnar det synligt i Finder.
Skriptet innehåller inget lösenord, och det bör förbli så. Låt monteringsåtgärden fråga, och låt nyckelringen göra det organisationen stöder. Att bädda in en inloggningsuppgift i en URL gör ett bekvämlighetsskript till en hemlighet som måste roteras.
Vad hjälparen inte kan göra
Tre gränser är värda att skriva bredvid appletten. Den kan inte mata ut en upptagen volym efter ett nätverksfel, den kan inte garantera att DNS och servern är redo när tillståndet säger ansluten, och den reagerar inte på varje återanslutning.
Den första gränsen betyder mest i praktiken. En delning vars server försvinner lämnar en volym som ser monterad ut och blockerar vid åtkomst, och den artiga lösningen är att avsluta filoperationer och mata ut före en planerad frånkoppling. Den andra förklarar de flesta misslyckade första försöken: tunneln är uppe medan resolvern inte har hunnit ikapp, så vänta och montera sedan för hand en gång för att bekräfta. Den tredje är pollningsavvägningen från tidigare snarare än en bugg att åtgärda.
För en obemannad maskin eller en hanterad flotta är den här designen fel form. Använd en monteringspolicy som ägs av administratören i stället för att utvidga en skrivbordsapplet till en privilegierad tjänst.