it-swarm.com.de

Wie werden (FTP) -Dateien in einem Bash-Skript auf den Server hochgeladen?

Ich versuche, ein Bash-Skript zu schreiben, das eine Datei auf einen Server lädt. Wie kann ich das erreichen? Ist ein Bash-Skript das Richtige dafür?

42
Andrew

Hier sind zwei Antworten. Erstens ist ein Vorschlag, eine sicherere/flexiblere Lösung wie ssh/scp/sftp zu verwenden. Zweitens wird erläutert, wie Sie FTP im Stapelmodus ausführen. 

Eine sichere Lösung:

Sie sollten wirklich SSH/SCP/SFTP anstelle von FTP verwenden. SSH/SCP bietet die Vorteile, sicherer zu sein und mit öffentlichen/privaten Schlüsseln zu arbeiten, sodass es ohne Benutzernamen oder Kennwort ausgeführt werden kann.

Sie können eine einzelne Datei senden:

scp <file to upload> <username>@<hostname>:<destination path>

Oder ein ganzes Verzeichnis:

scp -r <directory to upload> <username>@<hostname>:<destination path>

Weitere Informationen zum Einrichten von Schlüsseln und zum Verschieben von Dateien mit RSYNC auf den Server. Dies ist nützlich, wenn Sie viele Dateien verschieben möchten oder wenn Sie manchmal nur eine neue Datei aus einem Satz zufälliger Dateien erhalten.

http://troy.jdmz.net/rsync/index.html

Sie können auch einen einzelnen Befehl nach dem Umschalten auf einen Server ausführen:

Von man ssh

ssh [... snipped ...] hostname [Befehl] Wenn der Befehl angegeben ist, lautet er auf dem Remote-Host statt einer Login-Shell ausgeführt.

Ein Beispielbefehl lautet also:

ssh [email protected] bunzip file_just_sent.bz2

Wenn Sie SFTP mit Schlüsseln verwenden können, um die Vorteile einer gesicherten Verbindung zu nutzen, gibt es zwei Tricks, mit denen Sie Befehle ausführen.

Zunächst können Sie Befehle mit Echo und Pipe übergeben

echo "put files*.xml" | sftp -p -i ~/.ssh/key_name [email protected]

Sie können eine Batchdatei auch mit dem Parameter -b verwenden:

sftp -b batchfile.txt ~/.ssh/key_name [email protected]

Eine FTP-Lösung, wenn Sie es wirklich brauchen:

Wenn Sie verstehen, dass FTP unsicher und eingeschränkter ist und Sie wirklich ein Skript erstellen möchten ...

Dazu gibt es einen tollen Artikel unter http://www.stratigery.com/scripting.ftp.html

#!/bin/sh
Host='ftp.example.com'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $Host <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
binary
put $FILE
quit
END_SCRIPT
exit 0

Das "-n" an ftp stellt sicher, dass der Befehl nicht versucht, das Kennwort vom aktuellen Terminal zu erhalten. Der andere fantastische Teil ist die Verwendung eines Heredocs: Der <<END_SCRIPT startet das Heredoc, und dann beendet genau dieser END_SCRIPT am Anfang der Zeile den Heredoc. Mit dem Befehl binary wird der Binärmodus aktiviert. Dies ist hilfreich, wenn Sie etwas anderes als eine Textdatei übertragen.

51
greggles

Sie können ein heredoc verwenden, um dies zu tun, z.

ftp -n $Server <<End-Of-Session
# -n option disables auto-logon

user anonymous "$Password"
binary
cd $Directory
put "$Filename.lsm"
put "$Filename.tar.gz"
bye
End-Of-Session

der ftp-prozess wird also von stdin mit allem bis End-Of-Session gespeist. Ein nützlicher Tipp, um jeden Prozess zu starten, nicht nur FTP! Beachten Sie, dass dies das Laichen eines separaten Vorgangs (Echo, Katze usw.) erspart. Keine bedeutende Ressourcensparung, aber es lohnt sich zu bedenken.

76
Brian Agnew

Installieren Sie ncftpput und ncftpget. Sie sind normalerweise Teil desselben Pakets.

18
Paul Tomblin

befehl in einer Zeile:

ftp -in -u ftp://username:[email protected]/path/to/ localfile
6
Chizhik

verwenden Sie diese Option, um eine Datei an einen entfernten Speicherort hochzuladen

#!/bin/bash
#$1 is the file name
#usage:this_script <filename>
Host='your Host'
USER="your user"
PASSWD="pass"
FILE="abc.php"
REMOTEPATH='/html'

ftp -n $Host <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
cd $REMOTEPATH
put $FILE 
quit
END_SCRIPT
exit 0
6
Shal
#/bin/bash
# $1 is the file name
# usage: this_script  <filename>
IP_address="xx.xxx.xx.xx"
username="username"
domain=my.ftp.domain
password=password

echo "
 verbose
 open $IP_address
 USER $username $password
 put $1
 bye
" | ftp -n > ftp_$$.log
4
ennuikiller

Keine Notwendigkeit, Sachen zu komplizieren - das sollte funktionieren:

#/bin/bash
echo "
 verbose
 open ftp.mydomain.net
 user myusername mypassword
 ascii
 put textfile1
 put textfile2
 bin
 put binaryfile1
 put binaryfile2
 bye
" | ftp -n > ftp_$$.log

oder Sie können mput verwenden, wenn Sie viele Dateien haben ...

3
Martin Hvidberg

Arbeitsbeispiel, um Ihre Datei auf den Stamm zu setzen ........... Sieh es sehr einfach

#!/bin/sh
Host='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $Host <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0
1
Shal

wenn Sie es in einem "for" verwenden möchten, um die zuletzt erzeugten Dateien für ein alltägliches Bacakup zu kopieren ...

j=0  
var="`find /backup/path/ -name 'something*' -type f -mtime -1`"  
#we have in $var some files with last day change date

for i in $var  
  do  
  j=$(( $j + 1 ))  
  dirname="`dirname $i`"  
  filename="`basename $i`"  
  /usr/bin/ftp -in >> /tmp/ftp.good 2>> /tmp/ftp.bad << EOF  
    open 123.456.789.012  
    user user_name passwd  
    bin  
    lcd $dirname  
    put $filename  
    quit  
  EOF      #end of ftp  
done       #end of for iteration
0
oso_togari

Der Befehl ftp ist nicht für Skripte vorgesehen, daher ist die Steuerung umständlich und das Abrufen des Beendigungsstatus noch umständlicher.

Curl ist skriptfähig und bietet außerdem den Vorteil, dass Sie später problemlos zu anderen Protokollen wechseln können, indem Sie einfach die URL ändern. Wenn Sie Ihre FTP-Anmeldeinformationen in .netrc eingeben, können Sie einfach Folgendes tun:

# Download file
curl --netrc --remote-name ftp://ftp.example.com/file.bin
# Upload file
curl --netrc --upload-file file.bin ftp://ftp.example.com/

Falls erforderlich, können Sie den Benutzernamen und das Kennwort direkt in der Befehlszeile mit --user username:password Anstelle von --netrc Angeben.

0
Pelle Nilsson

cd C:\Programme (x86)\WinSCP

winscp.exe/console/Befehl "Benutzername öffnen:* * @ Server" "Dateipfad einfügen" 

0
Naveen Sharma