ubuntuusers.de

BASH: scp Verständnisproblem

Status: Gelöst | Ubuntu-Version: Kubuntu 22.04 (Jammy Jellyfish)
Antworten |

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 888

Hallo @shiro

Wie sieht ein Zugriff über FTPS aus? Ist $ lftp der richtige Ansatz?

Ob der WebServer des Service Providers "ftps" unterstützt, kann man leicht feststellen, wie die Antwort auf einen ftps-Verbindungsaufbau ausschaut.

Der ftps-Aufbau bei All-Inkl.com (kasserver.de) (nur!) funktioniert so:

# Variablen für FTP-Transfer
strWebLogIn="kasserver.com"
strWebUser="username"
strWebPassword="password"

# FTP-Verbindung aufbauen
# Hier würde mit lftp ftps:// versucht, eine implizite FTPS Verbindung (Port 990) aufzubauen; dies ist nicht möglich! Man muss ftp:// verwenden und im Anschluss zu einer expliziten FTPS Verbindung wechseln.
lftp ftp://"$strWebUser.$strWebLogIn" -u "$strWebUser","$strWebPassword"        # kein BLANK zulässig zwischen User und Password!
set ftp:ssl-force true                                                          # ftps setzen
set ftp:ssl-protect-data true

Dann habe ich einen FTP-Prompt lftp username@username.kasserver.com:/> und erhalte nach dem Konsolen-Befehl ls den Verzeichnisinhalt.

Nach dieser Anleitung (Suchstring put wp) kann ich den put-Befehl in der Konsole absetzen und die Datei wird an die richtige Stelle übertragen:

put "/localPath/localFile.html" -o "onlinePath/HowToMap/onlineFile.html"

Und so funktioniert der put-Befehl im BASH-Scrpt:

lftp ftp://"$strWebUser.$strWebLogIn" -u "$strWebUser","$strWebPassword" << EOF # kein BLANK zulässig zwischen User und Password!
set ftp:ssl-force true            # ftps setzen
set ftp:ssl-protect-data true

put "$strPathLocale/$strFileONline" -o "$strWebDir$strFileONline"
bye
EOF

Danke, Michael

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11309

Wohnort: München

Das Problem ist, dass du zu dem Zeitpunkt nicht mehr in der Bash bist, sondern in einer Shell von lftp - die Bash wartet also darauf, dass sich der lftp-Prozess beendet, bevor versucht würde die set ftp:ssl-force true Zeile zu verarbeiten.

Wenn du dir die Manpage von lftp asiehst (vgl. man 1 lftp), siehst du, dass man dem lftp-Befehl eine Datei mit Anweisungen mitgeben kann - du könntest also z.B. eine lftp-commands.txt erstellen, die so einen Inhalt hat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Verbindung herstellen
open -u username,password ftp://kassenserver.com

set ftp:ssl-force true          # Force SSL/TLS for both control and data channels
set ftp:ssl-protect-data true   # Protect data channel (encryption for transfers)

# Optional: entferntes und lokales Verzeichnis anpassen
cd /remote/path/
lcd /local/path/
# Text-Dateien hochladen
mput *.txt

# FTP-Sitzung beenden
bye

Und dann lftp Skript mittels lftp -f lfpt-commands.txt ausführen lassen.

Wenn man die Variablen der Shell nutzen wollte, könnte man ein Here-Document nutzen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Variablen für FTP-Transfer
strWebLogIn="kasserver.com"
strWebUser="username"
strWebPassword="password"

lftp -f <<EOF
# Verbindung herstellen
open -u ${strWebUser},${strWebPassword} ftp://${strWebLogIn}

set ftp:ssl-force true          # Force SSL/TLS for both control and data channels
set ftp:ssl-protect-data true   # Protect data channel (encryption for transfers)

# Optional: entferntes und lokales Verzeichnis anpassen
cd /remote/path/
lcd /local/path/
# Text-Dateien hochladen
mput *.txt

# FTP-Sitzung beenden
bye
EOF

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1466

Der ftps-Aufbau bei All-Inkl.com (kasserver.de) (nur!) funktioniert so: ...

Herzlichen Glückwunsch zur erfolgreichen FTPS Anbindung.

Die Definitionen von "set ftp:ssl-..." werden normalerweise in der Datei "$HOME/.lftprc" abgelegt und sind daher nicht jedes mal beim Verbindungsaufbau anzugeben. Weiterhin kann man den Aufruf über eine "Bookmark" Definition vereinfachen. Die Bookmarks werden in der Regel in der Datei "$HOME/.local/share/lftp/bookmarks" gespeichert. Man definiert einen beliebigen Namen (z.B. myweb) und ordnet den Zugang mit User und Passwort zu. Beispiel:

$ lftp
lftp :~> bookmark add myweb ftp://${strWebUser}:${strWebPassword}@${strWebUser}.${strWebLogIn}
lftp :~> exit
$ 
$ # vereinfachter Aufruf nun möglich mit	
$ lftp myweb

Wie muss der put-Befehl in meinem BASH-aussehen?
Wie muss ich den FTP-prozess beenden?

Unter Verwendung des oben definierten Bookmark wäre dies:

$ lftp myweb -e "put /localPath/localFile.html -o onlinePath/HowToMap/onlineFile.html; exit"
$ 

Der String nach dem "-e" Qualifier trennt die einzelnen Befehle durch das Semikolon(";"). Man kann natürlich auch eine Befehlsdatei erstellen und diese mit dem Befehl "source" ausführen. Beispiel:

$ echo "cd onlinePath/HowToMap
put localFile.html -o onlineFile.html
put weitereDatei.html
echo Listing der html Dateien
ls *.html
echo lösche weitereDatei.html
rm weitereDatei.html
ls *.html
echo "Ende"
exit" >batch.src
$ # Nun Aufruf des Scripts
$ lftp myweb -e "source batch.src"
Verzeichniswechsel OK, cwd=/home/user/defaultDir
Listing der html Dateien                                          
-rw-rw----    1 502      500            41 Oct 30 17:18 onlineFile.html
-rw-rw----    1 502      500            11 Oct 30 17:18 weitereDatei.html
lösche weitereDatei.html
-rw-rw----    1 502      500            41 Oct 30 17:18 onlineFile.html
Ende
$ 

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 888

Danke @seahawk1986:

Wenn man die Variablen der Shell nutzen wollte, könnte man ein Here-Document nutzen:

Zeitgleich mit Deinem Posting hatte ich meinen Code erstellt:

lftp ftp://"$strWebUser.$strWebLogIn" -u "$strWebUser","$strWebPassword" <<EOF
     set ftp:ssl-force true
     set ftp:ssl-protect-data true
     put "$strPathLocale/$strFileONline" -o "$strWebDir$strFileONline"
     bye
EOF

Das lauft auch, aber ich benötige insgesamt "darüber" ein if-Konstrukt also

if ! ....... Weiter?" --title "How to "; then
     # code
     lftp ftp://"$strWebUser.$strWebLogIn" -u "$strWebUser","$strWebPassword" <<EOF
          # code
     EOF
fi   

Damit erhalte ich

Unerwartetes Dateiende vom Kommando 'if'

Wie kann ich das abstellen? Kann es sein, dass das EOF nicht eingerückt stehen darf?

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1466

Kann es sein, dass das EOF nicht eingerückt stehen darf?

Ja. In der Zeile dürfen bei dir nur die 3 Zeichen "EOF" stehen. Nichts davor, nichts dahinter.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4784

Wohnort: Berlin

Ergänzend: Zwischen den beiden EOF wird auch alles genau so übernommen, also auch die führenden Leerzeichen in jeder Textzeile. Wenn lftp damit klar kommt ist das okay, aber nicht in jedem Fall geht so etwas. In einigen Fällen hat so etwas eventuell auch subtile Auswirkungen. Zum Beispiel ob Befehle in einen Verlauf übernommen werden oder nicht.

Antworten |