Upload auf FTP mit Applescript

S

svenson1

Aktives Mitglied
Thread Starter
Dabei seit
18.07.2007
Beiträge
111
Reaktionspunkte
12
Hallo,

ich möchte nach eine einstellbaren Zeit, Dateien auf einen FTP Server laden.
Mit folgendem Applescript funktioniert das ganze:

Code:
Code:
set temp to display dialog "Zeit bis zur Übertragung in Sekunden" default answer "" buttons {"OK"} default button 1
set wartezeit to text returned of temp
delay wartezeit

tell application "Terminal"
   do script "curl -T /mein/locales/Quellverzeichnis/* ftp://mein FTP-Server/ --user ftpuser:ftppass"
end tell

Wenn nur eine Datei in meinem Quellverzeichnis liegt, funktioniert das ganze. Wenn aber mehrere Dateien im Verzeichnis sind bekomme ich im Terminal folgende Fehlermeldung:

curl: (3) <url> malformed

Ist es so, dass curl für jede Datei die FTP-Verbindung neu aufbauen muss und es deshalb bei mehreren Dateien nicht geht? Kann ich curl dazu bewegen mehr als 1 Datei zu übertragen? Oder gibt es für mein "simples" Problem eine bessere elegantere Lösung?
 
Zuletzt bearbeitet von einem Moderator:
Code:
tell application "Terminal"
do script "for Datei in /mein/locales/Quellverzeichnis/*; do curl -T $Datei ftp://mein FTP-Server/ --user ftpuser:ftppass; done"
end tell
oder
Code:
tell application "Terminal"
do script "find /folder/path/ -name '*' -type f -exec curl -u USERNAME:PASSWORD -T {} http://www.example.com/folder/ \;"
end tell
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: svenson1
Danke CyberTom, ich habe mit Version 1 probiert und es funktioniert gut - danke ;-)
 
»tell app "terminal"« kannst du komplett weglassen und aus gründen der sicherheit solltest du "-u user/pw" nicht verwenden, das wäre i.d.R in "ps" sichtbar. schau mal nach .netrc (auch im curl-manual).
 
Ja, wegen der Sicherheit kümmere ich mich noch - Danke für den Tip!

2 Dinge sind mir so noch aufgefallen:
  1. Das Countdownfensterchen muss immer aktiv sein. Sobald ich nur mal in den Finder klicke läuft er nicht mehr. Wie läuft der Countdown auch im Hintergrund weiter?
  2. Gestern hat curl mit einer Fehlermeldung abgebrochen (broken pipe). Wie kann ich diese Meldungen von curl auswerten, oder wie in diesem Fall einfach die Übertragung nochmals starten?
 
[..] aus gründen der sicherheit solltest du [..]

Ich korrigiere das mal für dich: Aus Gründen der Sicherheit sollte er FTP komplett weglassen, dann auch noch mit user/password option und nicht anonymous. Ich hoffe das geht wenigstens nicht übers Internet, sonden nur über ein lokales Netz oder einem VPN.
Ich frag mich echt welche Gründe es für jemanden überhaupt noch gibt FTP zu nutzen. Jeder Server den ich kenne hat SSH/SFTP.
 
Ich frag mich echt welche Gründe es für jemanden überhaupt noch gibt FTP zu nutzen. Jeder Server den ich kenne hat SSH/SFTP.
Im Prinzip hast du absolut Recht, wenn ich aber z.B. mal schnell ein paar Dateien in iOS-Apps haben will, ist ein FTP-Server im LAN recht angenehm. Nicht alle iOS-Apps können SFTP und da ist ein lokaler FTP der nicht von außen erreichbar ist, für temporäre Aufgaben recht brauchbar.
 
eben und ich habe auch noch mit elendig vielen älteren geräten zu tun, die nur smb oder ftp anbieten. da fällt dann bei applemaschinen die wahl aus tempogründen eh' nicht schwer. und ja, alles nur im LAN.

1. probier's mit sleep in do script...
2. du musst den exit code auswerten (evtl. einfach mit until schleife).

-> bau gleich ein ordentliches shellscript und nimm applescript nur als starter.
 
Um das Programm auch im Hintergrund laufen zu lassen, habe ich im Programm - Paketinhalt die Datei Content/Info.plist mit folgenden Zeilen ergänzt:

<key>NSUIElement</key>
<string>1</string>

Nun läuft es auch im Hintergrund weiter.
Du hast aber natürlich recht - es komplett in ein shellscript zu packen ist noch besser.

Wie bekomme ich den exit code einfach in eine Variable? Denn wenn die Übertragung fehlerfrei durchläuft, kommt ja nix.
 
Wie bekomme ich den exit code einfach in eine Variable?
brauchst du ja direkt nicht.

es wird maximal drei mal versucht, curl erfolgreich abzuarbeiten:
Code:
loopcount=0
until curl...
 do
  ((loopcount++))
  #echo $loopcount
  [[ $loopcount -ge 3 ]] && { echo "error..."; say "error..."; break; }
  sleep 1
 done

Denn wenn die Übertragung fehlerfrei durchläuft, kommt ja nix.
dann gab's 0 -> kein fehler.
 
  • Gefällt mir
Reaktionen: svenson1
Danke Olivetti, das probiere ich aus ;-)
 
Zurück
Oben Unten