web-dev-qa-db-fra.com

Comment télécharger des fichiers (FTP) sur le serveur dans un script bash?

J'essaie d'écrire un script bash qui télécharge un fichier sur un serveur. Comment puis-je atteindre cet objectif? Un script bash est-il la bonne chose à utiliser pour cela?

42
Andrew

Voici deux réponses. Tout d'abord, il est suggéré d'utiliser une solution plus sécurisée/flexible telle que ssh/scp/sftp. La seconde est une explication sur la façon d’exécuter FTP en mode batch. 

Une solution sécurisée:

Vous devriez vraiment utiliser SSH/SCP/SFTP pour cela plutôt que FTP. SSH/SCP présente l’avantage d’être plus sécurisé et de travailler avec des clés publiques/privées, ce qui lui permet de fonctionner sans nom d’utilisateur ni mot de passe.

Vous pouvez envoyer un seul fichier:

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

Ou tout un répertoire:

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

Pour plus de détails sur la configuration des clés et le transfert de fichiers sur le serveur avec RSYNC, ce qui est utile si vous avez beaucoup de fichiers à déplacer ou si vous obtenez parfois un seul nouveau fichier parmi un ensemble de fichiers aléatoires, consultez:

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

Vous pouvez également exécuter une seule commande après avoir sshing sur un serveur:

De man ssh

ssh [... snipped ...] nomhôte [commande] Si commande est spécifiée, il s'agit de exécuté sur l'hôte distant au lieu d'un shell de connexion.

Ainsi, un exemple de commande est:

ssh [email protected] bunzip file_just_sent.bz2

Si vous pouvez utiliser SFTP avec des clés pour bénéficier d’une connexion sécurisée, j’ai utilisé deux astuces pour exécuter des commandes.

Tout d’abord, vous pouvez passer des commandes en utilisant echo et pipe

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

Vous pouvez également utiliser un fichier batch avec le paramètre -b:

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

Une solution FTP, si vous en avez vraiment besoin:

Si vous comprenez que le FTP est peu sécurisé et plus limité et que vous voulez vraiment le scripter ...

Il existe un excellent article à ce sujet sur 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

Le "-n" à ftp garantit que la commande ne tentera pas d'obtenir le mot de passe du terminal actuel. L’autre partie intéressante est l’utilisation d’un heredoc: le <<END_SCRIPT commence l’heredoc, puis le même END_SCRIPT au début de la ligne termine lui-même l’hérédoc. La commande binary le mettra en mode binaire, ce qui est utile si vous transférez autre chose qu'un fichier texte.

51
greggles

Vous pouvez utiliser un heredoc pour le faire, par exemple.

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

le processus ftp est donc alimenté en stdin avec tout jusqu'à End-Of-Session. Un conseil utile pour générer tout processus, pas seulement ftp! Notez que cela évite de générer un processus séparé (écho, chat, etc.). Pas une économie de ressources majeure, mais il convient de garder à l'esprit.

76
Brian Agnew

Installez ncftpput et ncftpget. Ils font généralement partie du même paquet.

18
Paul Tomblin

commande en une ligne:

ftp -in -u ftp://username:password@servername/path/to/ localfile
6
Chizhik

utilisez-le pour télécharger un fichier sur un emplacement distant

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

Pas besoin de compliquer les choses - cela devrait marcher:

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

ou vous pouvez utiliser mput si vous avez beaucoup de fichiers ...

3
Martin Hvidberg

Exemple de travail pour mettre votre fichier en racine ........... voir très simple

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

si vous voulez l'utiliser dans un 'for' pour copier les derniers fichiers générés pour un bacakup quotidien….

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

cd C:\Program Files (x86)\WinSCP

winscp.exe/console/commande "open UserName:* * @ Server" "chemin de fichier 

0
Naveen Sharma