2012-04-24 5 views
0

Je suis en train de télécharger plusieurs fichiers d'un dossier vers un site ftp et a écrit ce script:Script Shell pour charger plusieurs fichiers FTP

#!/bin/bash 
for i in '/dir/*' 
do 
if [-f /dir/$i]; then 
HOST='x.x.x.x' 
USER='username' 
PASSWD='password' 
DIR=archives 
File=$i 

ftp -n $HOST << END_SCRIPT 
quote USER $USER 
quote PASS $PASSWD 
ascii 
put $FILE 
quit  
END_SCRIPT 
fi  

Il me donne l'erreur suivante lorsque je tente d'exécuter:

[email protected]:~/Documents/Python$ ./script.sh 
./script.sh: line 22: syntax error: unexpected end of file 

Je n'arrive pas à faire marcher ça. Toute aide est très appréciée.

Merci, Mayank

+0

La 'fin inattendue du fichier' est parce que vous avez une boucle 'for' w sans un «fait» correspondant à la fin. –

+0

Pour faciliter la tâche à vos assistants, indiquez les corps de la structure de contrôle 'for',' if', etc. Merci! – Jens

Répondre

1

Il se plaint parce que votre boucle for ne dispose pas d'un marqueur done pour indiquer la fin de la boucle. Vous devez également plus d'espaces dans votre if:

if [ -f "$i" ]; then 

Rappelons que [ est en fait une commande, et il ne sera pas reconnu si elle ne semble pas en tant que tel. Et ... si vous célébrez simplement votre glob (au for) comme ça, il ne sera pas développé. Pas de guillemets, mais des guillemets lorsque vous utilisez $i. Vous ne voulez probablement pas non plus inclure la partie /dir/ lorsque vous utilisez $i car il est inclus dans votre glob.

+0

J'ai fait les changements que vous avez suggérés et j'ai l'erreur suivante: ** user @ host: ~/Documents/Python $ ./script.sh Mauvaise séquence de commandes. Mauvaise séquence de commandes. (fichier local) (fichier distant) Mauvaise séquence de commandes. Mauvaise séquence de commandes. (fichier-local) (fichier-distant) ** – maksaraswat

0

Si je ne me trompe pas, ncftp peut prendre des arguments génériques:

ncftpput -u username -p password x.x.x.x archives /dir/* 

Si vous ne l'avez pas déjà installé, il est probable que disponible dans le repo standard pour votre système d'exploitation.

+0

'lftp' peut aussi le faire (il a une commande' mput' pour faire une seule mise multi-fichiers). –

+0

Aussi, je ne pense pas que votre commande utilise ici le mode ASCII, ce qui le rend différent du script original. –

+0

Certes, il est juste de s'attendre à ce que l'OP fasse un * petit * du travail ... :) –

0

D'abord, le littéral, la réponse de fixation-votre-scriptum:

#!/bin/bash 
# no reason to set variables that don't change inside the loop 
host='x.x.x.x' 
user='username' 
password='password' 
dir=archives 
for i in /dir/*; do # no quotes if you want the wildcard to be expanded! 
    if [ -f "$i" ]; then # need double quotes and whitespace here! 
    file=$i 
    ftp -n "$host" <<END_SCRIPT 
quote USER $user 
quote PASS $password 
ascii 
put $file $dir/$file 
quit  
END_SCRIPT 
    fi 
done 

Ensuite, la voie facile:

lftp -e 'mput -a *.i' -u "$user,$password" "ftp://$host/" 

(oui, lftp élargit le caractère générique interne, plutôt que d'attendre que cela être fait par la coquille externe).

+0

Merci à tous pour toutes vos suggestions. Cela aide vraiment. J'ai changé mon script à ce que Charles a suggéré et quand je l'exécute, je reçois les erreurs suivantes: username @ host: ~/Documents/Python $ ./script.sh Mauvaise séquence de commandes. Mauvaise séquence de commandes. (fichier local) (fichier distant) Mauvaise séquence de commandes. Mauvaise séquence de commandes. (fichier local) (fichier distant) – maksaraswat

+0

@ user1354065 Les implémentations FTP varient, donc aucun script ne peut être garanti pour fonctionner dans l'ensemble d'entre eux. Puis-je vous suggérer d'essayer la version lftp? –

+0

@ user1354065 ... qui dit, à l'examen - la capitalisation variable était incohérente; le nom était assigné à '$ File', mais' $ FILE' était en cours de déréférencement. Pour les variables non exportées dans l'environnement, l'utilisation de toutes les majuscules est en fait contraire à la convention, donc j'ai mis à jour ceci pour utiliser tout-minuscule. –

0

Tout d'abord, je m'excuse de ne pas m'être clairement posé la question. Ma tâche consistait à copier un fichier du dossier local vers un site SFTP, puis à déplacer le fichier dans un dossier d'archivage. Puisque le SFTP est hébergé par un fournisseur, je ne peux pas utiliser le partage de clés (limitation du fournisseur.) SCP exigera également la saisie du mot de passe s'il est utilisé dans un script shell, donc je dois utiliser SSHPASS. être installé from here

fil actuel et How to run the sftp command with a password from Bash script? ne m'a donné une meilleure compréhension sur la façon d'écrire le script et je vais partager ici ma solution:

#!/bin/bash 
#!/usr/bin 

for i in /dir/*; do 
if [ -f "$i" ]; then 
file=$i 
    export SSHPASS=password 
    sshpass -e sftp -oBatchMode=no -b - [email protected] << ! 
    cd foldername/foldername 
    put $file 
bye 
! 
mv $file /somedir/test 
fi 
done 

Merci à tous pour toutes les réponses --Mayank

Questions connexes