Mengubah Aksi Automator dalam skrip applescript menjadi bash

0

Saya baru saja menulis aplikasi Automator menggunakan AppleScript (bersama dengan beberapa garis bash) untuk memulai FTP dengan satu klik. Namun itu berjalan lebih dari sedikit lambat. Ini kodenya:

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

Inilah yang dilakukan oleh kode:

  1. Periksa apakah server FTP sedang berjalan
  2. Jika ya, matikan dan buang kotak pesan yang mengatakan "sesi FTP ditutup"
  3. Jika tidak, nyalakan dan buang kotak pesan yang mengatakan "sesi FTP terbuka" bersama dengan alamat IP dan nama pengguna saya

Skrip ini berfungsi seperti mantra tetapi karena terlalu lambat, saya ingin tahu apakah ada cara untuk mengubahnya menjadi skrip bash shell. Itu harus mempercepat banyak hal. Ada saran?

Pembelajar
sumber

Jawaban:

2

Saya tidak yakin saya mengerti dengan benar - jika di baris ketiga skrip Anda, Anda sedang memeriksa apakah ftplayanan berjalan Anda dapat menggunakan skrip berikut:

#!/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

Jalankan ini a sudo. Penjelasan:

  • Untuk memeriksa apakah pekerjaan sedang berjalan gunakan launchctl list.
  • Untuk mendapatkan alamat IP dengan cepat, gunakan skrip perl saya (Anda mungkin ingin melakukannya grepsecara berbeda untuk menyingkirkan alamat IP tambahan.
  • Satu-satunya masalah sekarang adalah bahwa aplikasi Finder tidak dibawa ke depan tetapi ini dapat diselesaikan jika diperlukan.
Mateusz Szlosek
sumber
Penugasan ke IPADDR mengasumsikan bahwa hanya ada satu antarmuka jaringan yang aktif selainlocalhost
nohillside
1
@patrix itu benar. Saya telah menyebutkan hal itu dalam jawaban saya. Untuk mendapatkan satu antarmuka khusus skrip IP perlu diubah.
Mateusz Szlosek
Upps, benar, tidak menyadari bahwa
nohillside
1
@AmitSchandillia Anda dapat memasukkan skrip ini ke editor AppleScript, tambahkan baris seperti: do shell script ... with administrator privilegesAnda akan diminta untuk memasukkan kata sandi Anda. Cara lain adalah membuat aplikasi yang akan meluncurkan skrip Anda sudo. Umumnya executable tertutup dengan benar di dalam bundel * .app tidak harus meluncurkan Terminal.
Mateusz Szlosek
1
Jadi agak berisiko membiarkan aplikasi melakukan pekerjaan dengan privilege tinggi. Namun saya dapat membantu Anda mengkompilasi aplikasi ObjC untuk meluncurkan bashscript. Kami dapat mencoba meminta passowrd dengan prompt, atau sesuatu dengan setuid / setgid. Berikut adalah beberapa informasi tentang perbedaan: developer.apple.com/library/mac/documentation/security/…
Mateusz Szlosek