2012-04-24 6 views
0

Я пытаюсь загрузить несколько файлов из одной папки в FTP сайта и написал этот сценарий:Shell Скрипт для загрузки нескольких 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  

Это дает мне следующее сообщение об ошибке при попытке выполнить:

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

Возможно, я не могу заставить это работать. Буду признателен за любую оказанную помощь.

Спасибо, Mayank

+0

«Неожиданный конец файла» - это потому, что у вас есть 'for' loop w без соответствия 'done' в конце. –

+0

Чтобы облегчить ваши помощники, отпечатайте тела структуры управления 'for',' if' и т. Д. Спасибо! – Jens

ответ

1

Он жалуется, потому что ваш for цикл не имеет done маркер для обозначения конца цикла. Кроме того, необходимо больше пространства в вашей if:

if [ -f "$i" ]; then 

Напомним, что [ на самом деле команда, и это не будет распознано, если оно не появляется как таковой.

И ... если вы укажете свой глобус (на for), то он не будет расширен. Нет котировок, но двойные кавычки при использовании $i. Вероятно, вы также не хотите включать часть /dir/, когда используете $i, так как она включена в ваш глобус.

+0

Я внес изменения, которые вы предложили, и получив следующую ошибку: ** user @ host: ~/Documents/Python $ ./script.sh Плохая последовательность команд. Плохая последовательность команд. (локальный файл) (удаленный файл) Плохая последовательность команд. Плохая последовательность команд. (локальный файл) (удаленный файл) ** – maksaraswat

0

Если я не ошибаюсь, ncftp может принимать аргументы подстановочные:

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

Если вы не уже он установлен, то он, скорее всего, доступны в стандартном репо для вашей операционной системы.

+0

'lftp' также может это сделать (у него есть команда' mput' для создания одного, многофайлового). –

+0

Кроме того, я не думаю, что ваша команда здесь использует режим ASCII, что делает его отличным от исходного сценария. –

+0

Конечно, справедливо ожидать, что OP будет делать * немного * работы ... :) –

0

Во-первых, в буквальном смысле, фиксируя-ваш-скрипт Ответ:

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

Далее, легкий путь:

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

(да, LFTP расширяет подстановочные внутри, а не ожидали, что это выполняться внешней оболочкой).

+0

Спасибо всем за все предложения. Это действительно помогает. Я изменил свой сценарий на то, что предложил Чарльз, и когда я его выполняю, я получаю следующие ошибки: username @ host: ~/Documents/Python $ ./script.sh Плохая последовательность команд. Плохая последовательность команд. (локальный файл) (удаленный файл) Плохая последовательность команд. Плохая последовательность команд. (локальный файл) (удаленный файл) – maksaraswat

+0

@ user1354065 Реализации FTP различаются, поэтому ни один скрипт не может быть гарантирован для работы во всех них. Могу я предложить вам попробовать версию lftp? –

+0

@ user1354065 ... при этом, при рассмотрении - переменная капитализация была непоследовательной; имя присваивалось '$ File', но' $ FILE' было разыменовано. Для переменных, не экспортируемых в среду, использование all-uppercase фактически противоречит конвенции, поэтому я обновил это, чтобы использовать все-строчные. –

0

Прежде всего, мои извинения не дают ясного ответа. Моя фактическая задача состояла в том, чтобы скопировать файл из локальной папки на сайт SFTP, а затем переместить файл в папку архива. Поскольку SFTP размещается поставщиком, я не могу использовать общий доступ к ключам (ограничение поставщика. Кроме того, SCP потребует ввода пароля, если он используется в сценарии оболочки, поэтому я должен использовать SSHPASS. SSHPASS находится в репозитории Ubuntu, однако для CentOS ему необходимо быть установлена ​​from here

Текущей нить и How to run the sftp command with a password from Bash script? сделал дал мне лучше понять, как написать сценарий, и я поделюсь моим решением здесь:

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

спасибо всем за все ответы --Mayank

Смежные вопросы