Konwersja działania Automatora w skrypcie appleScript na skrypt bash


0

Właśnie napisałem aplikację Automator przy użyciu AppleScript (wraz z kilkoma linijkami bash), aby uruchomić FTP jednym kliknięciem. Działa jednak nieco wolniej. Oto kod:

set ftpstatus to "off"
try
    do shell script "echo \"QUIT\" | telnet 127.0.0.1" & " ftp 2>&1 | grep  \"Escape character is\" > /dev/null"
    set ftpstatus to "on"
on error
    set ftpstatus to "off"
end try
if (ftpstatus = "off") then
    set ipaddr to IPv4 address of (get system info)
    set sun to short user name of (get system info)
    do shell script "sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist" with administrator privileges
    tell application "Finder" to display alert "FTP Launched and ready for file-transfer" & character id 8233 & character id 8233 & character id 8233 & "Address: ftp://" & ipaddr & ":21" & character id 8233 & "User Name: " & sun
else
    do shell script "sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist" with administrator privileges
    tell application "Finder" to display alert "FTP session closed"
end if

Oto, co robi kod:

  1. Sprawdź, czy serwer FTP działa
  2. Jeśli tak, wyłącz go i wyświetl okno komunikatu „Sesja FTP zamknięta”
  3. Jeśli nie, włącz go i wyświetl pole komunikatu „Sesja FTP otwarta” wraz z moim adresem IP i nazwą użytkownika

Ten skrypt działa jak urok, ale ponieważ jest zbyt wolny, zastanawiam się, czy jest jakiś sposób na przekonwertowanie go na skrypt powłoki bash. To powinno znacznie przyspieszyć. Jakieś sugestie?

Odpowiedzi:


2

Nie jestem pewien, czy rozumiem poprawnie - jeśli w trzeciej linii skryptu Sprawdzasz, czy ftpusługa jest uruchomiona, możesz użyć następującego skryptu:

#!/bin/bash                                                                                                                   

launchctl list | grep ftpd

if [ $? != 0 ]; then
    IPADDR=$(ifconfig -a | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | grep -v 127.0.0.1)
    launchctl load "/System/Library/LaunchDaemons/ftp.plist"
    osascript -e "tell application \"Finder\" to display alert \"FTP Launched and ready for file-transfer\" & character id 8233 & character id 8233 & character id 8233 & \"Address: ftp://\" & \"$IPADDR\" & \":21\" & character id 8233 & \"User Name: \" & \"$USER\""
else
    launchctl unload -w "/System/Library/LaunchDaemons/ftp.plist"
    osascript -e 'tell application "Finder" to display alert "FTP session closed"'
fi

Uruchom to sudo. Wyjaśnienie:

  • Aby sprawdzić, czy zadanie jest uruchomione, użyj launchctl list.
  • Aby szybko uzyskać adres IP, użyj mojego skryptu perl (możesz chcieć grepinaczej w celu pozbycia się dodatkowych adresów IP.
  • Jedynym problemem jest teraz to, że aplikacja Finder nie jest wysunięta na pierwszy plan, ale można to rozwiązać w razie potrzeby.

Przypisanie do IPADDR zakłada, że ​​poza tym jest tylko jeden aktywny interfejs sieciowylocalhost
nohillside

1
@patrix, który jest poprawny. Wspomniałem o tym w mojej odpowiedzi. Aby uzyskać jeden określony interfejs, skrypt IP musiałby zostać zmieniony.
Mateusz Szlosek

Upps, prawda, nie zauważył tego
nohillside

1
@AmitSchandillia Możesz wstawić ten skrypt do edytora AppleScript, dodać wiersz w stylu: do shell script ... with administrator privilegesZostaniesz poproszony o podanie hasła. Innym sposobem jest stworzenie aplikacji, która uruchomi Twój skrypt sudo. Ogólnie pliki wykonywalne poprawnie zawarte w pakiecie * .app nie muszą uruchamiać terminalu.
Mateusz Szlosek

1
Dlatego ryzykowanie jest zezwalanie aplikacjom na pracę z podwyższonymi uprawnieniami. Mogę jednak pomóc Ci skompilować aplikację ObjC w celu uruchomienia bashscript. Możemy spróbować poprosić o passowrd z pytaniem lub coś z setuid / setgid. Oto kilka informacji o różnicach: developer.apple.com/library/mac/documentation/security/...
Mateusz Szlosek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.