Datei mit Rechtsklick auf einen FTP-Server ablegen

Ein Script, eingebunden in den Datei-Manager, um einzelne Elemente per Rechtsklick auf einen FTP-Server abzulegen.

Während des Uploads erscheint ein kleines Fenster, das über den Upload informiert:

Uploading file
„Uploading file“

Im Anschluss erscheint eine Benachrichtigung, die bestenfalls positiv ausfällt. Schlägt der Upload fehl, wird der Exit Code cURLs ausgegeben.

Notification in XFCE
Notification in XFCE

Die URL wird sofort in die Zwischenablage kopiert und kann im Browser eingefügt werden.
Um keine Dateien zu überschreiben, wird dem Dateinamen die aktuelle Unixzeit vorangestellt.

Die Dateinamen werden in ein webkonformes Format umgewandelt. So werden etwa Sonderzeichen und Leerzeichen entfernt und die Dateinamen in Kleinbuchstaben umgeschrieben.

Das Script „upf“ kann alternativ auch im Terminal verwendet werden. Pflicht ist lediglich die Angabe einer einzelnen Datei als Argument.

Das Script konfigurieren

Zu Beginn sind drei Abhängigkeiten zu erfüllen.
Zenity erzeugt das Benachrichtungsfenster, cURL lädt die Datei auf den FTP-Server hoch, xclip fügt die URL in die Zwischenablage ein.

sudo apt-get install xclip curl zenity

Ich nächsten Schritt werden die FTP-Zugangsdaten für den angemeldeten Benutzer abgelegt.
Besonders wichtig ist hierbei die Abänderung der Rechte. Ich empfehle zudem die Rechte des FTP-Benutzers auf Lesen und Schreiben zu beschränken. Der Zugriff sollte außerdem nur auf ein eigens für Uploads angelegtes Verzeichnis gestattet sein.

echo username:password > ~/.curlftpcred
chmod 600 ~/.curlftpcred

Eine kurze Erklärung der Konfiguration (bitte die Beispiele im Script beachten):

  • FTP_PATH – Der Pfad zum FTP-Server inkl. Verzeichnis der Uploads, ohne angefügtes /
  • WEB_PATH – Die HTTP URL zum obigen FTP-Verzeichnis, ebenfalls ohne angefügtes /
  • CRED_FILE – Auf den jeweiligen Benutzer angepasste Datei mit Zugangsdaten zum FTP im Format „Benutzername:Passwort“. Sonderzeichen ggf. „escapen“
  • CURL_EXTRA – Zusatzoptionen für cURL. Zum Beispiel „–ftp-ssl“ für eine explizite SSL-Verbindung. Implizites SSL benötigt keinen Paramter, stattdessen in „FTP_PATH“ mit „ftps://“ arbeiten.

Nun das Script erstellen:

sudo nano /usr/local/bin/upf

Inhalt:

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin

### CONFIG START ###
FTP_PATH=ftp://domain.tld/html_root/file_uploads
WEB_PATH=http://domain.tld/file_uploads
CRED_FILE=~/.curlftpcred
CURL_EXTRA=""
#### CONFIG END ####
SIMPLENAME=$(echo `date +%s`_$1 | sed -e 's/ /_/g' | tr A-Z a-z | tr -cd 'A-Za-z0-9._')
curl $CURL_EXTRA -# -T "$1" -u `cat $CRED_FILE` $FTP_PATH/$SIMPLENAME | zenity --pulsate --progress --auto-close --title "Uploading file" --no-cancel --text "Please wait..."
CURLEXIT=${PIPESTATUS[0]}
if [ "$CURLEXIT" != "0" ]; then
  notify-send "Upload failed!" "Your upload could not be finished.\nCurl Error: $CURLEXIT"
  exit 1;
fi
echo "$WEB_PATH/$SIMPLENAME" | xclip -i -selection "clipboard"
notify-send "\"$1\" uploaded successfully!" "Path copied to clipboard:\n$WEB_PATH/$SIMPLENAME"

Die Datei noch als ausführbar markieren:

sudo chmod +x /usr/local/bin/upf

File-Manager Aktion einrichten

Thunar

Thunar_FTP_1
Thunar starten, „Bearbeiten“ > „Benutzerdefinierte Aktionen…“ auswählen
Thunar_FTP_4
Auf das „+“-Symbol klicken, um eine neue Aktion zu konfigurieren.
Thunar_FTP_2
Die neue Aktion benennen und als Befehl „upf %n“ eintragen. Optional eine Beschreibung/ein Symbol definieren. (Beispiel: http://blog.dieweltistgarnichtso.net/tango-upload-icon-proposal, wobei das kleinste Symbol zu wählen wäre.)
Thunar_FTP_3
Im Reiter „Dateizuordnung“ alle Häkchen außer „Ordner“ auswählen.

Nautilus

(folgt)

8 Antworten auf “Datei mit Rechtsklick auf einen FTP-Server ablegen

  1. killermoehre

    GVFS (und damit Thunar) sprechen nativ (S)FTP(S). Also bleibt als einziger Vorteil von deinem Skript die automatische URL-Erzeugung, welche man aber sicher auch noch per Rechts-Klick-Aktion zusammen mit einer kleinen Zuordnung Host -> URL lösen könnte.

    killermoehre

    1. André P. Autor

      Ja, klar, das tut es. Aber der Vergleich hinkt.
      Du kannst dir ein Lesezeichen setzen, in das du die Datei reinkopierst, ja. Genau das soll damit doch erspart bleiben?!
      Und: Eine Rechtsklick-Aktion für die URL ist doch dann schon wieder ein Schritt mehr, den man tut, oder? ;) So habe ich einen Klick für Upload und Pfad kopieren, dazu werden die Dateinamen noch in „websichere“ Namen umgeschrieben im Script.

    1. André P. Autor

      Danke! Ja, das habe ich leider etwas blöd im Artikel versteckt, siehe „CURL_EXTRA“.

      Beispiel für explizites SSL (über Port 21, erst ab „AUTH SSL“ verschlüsselt, danach vollständig):

      CURL_EXTRA="--ftp-ssl"

      Implizites SSL benötigt keinen Paramter, stattdessen:

      FTP_PATH="ftps://domain.tld/uploads"

      Implizit ist die Art, die (normalerweise) über Port 990 läuft.

      Wenn du ein selbst-signiertes Zertifikat hast, musst du vielleicht noch noch einen Parameter als „CURL_EXTRA“ setzen, z.B.:

      CURL_EXTRA="--ftp-ssl --insecure"

      Grüße
      André

      Edit: Sorry, jetzt war ich bei FTPS. Via SSH geht es auch, dazu morgen mehr. Hierfür wären ein paar kleine Änderungen notwendig.

        1. André P. Autor

          So, sorry, habe das leider etwas verschlafen.
          Jedenfalls solltest du bei der Verwendung von SFTP mehrere Dinge beachten…

          – Wenn du nicht gerade den Key installiert hast, musst du vermutlich „–insecure“ als CURL_EXTRA eintragen.
          – Als Adresse einfach das Muster übernehmen, aber durch „sftp://“ ersetzen.
          – Am besten einen eigenen Benutzer für die Uploads anlegen, besser noch keine Shell hinterlegen („/bin/false“) und in das Verzeichnis der Uploads einsperren (Stichwort „chroot“). Das geht auch mit OpenSSH, ansonsten mal nach „rssh“ suchen, ist aber etwas komplizierter als die Lösung über OpenSSH.
          Dazu habe ich noch diesen Artikel auf die Schnelle gefunden:
          https://www.mynakedgirlfriend.de/sichere-chroot-umgebung-fur-ssh-dateiubertragungen-sftp/

          Danach hättest du eine sichere Lösung mit User/Pass-Authentifizierung.
          Natürlich wäre es auch möglich, das Script etwas abzuändern, damit eine Key-Auth. funktionieren würde.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.