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?
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.
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]
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.
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.
Installez ncftpput et ncftpget. Ils font généralement partie du même paquet.
commande en une ligne:
ftp -in -u ftp://username:password@servername/path/to/ localfile
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
#/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
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 ...
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
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
cd C:\Program Files (x86)\WinSCP
winscp.exe/console/commande "open UserName:* * @ Server" "chemin de fichier