2012-04-24 147 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'循环w末尾没有匹配的“完成”。 – 2012-04-24 15:36:02

+0

为了让你的帮手更容易,请缩进'for','if'等控件结构体。谢谢! – Jens 2012-05-04 15:12:20

回答

1

它的抱怨,因为您for循环没有一个done标记指示循环的结束。您还需要在您的if更多的空间:

if [ -f "$i" ]; then 

回想一下,[实际上是一个命令,如果没有出现这样它不会被识别。

而且,如果您单引号您的glob(在for),那么它将不会被展开。没有引号,但使用$i时加了双引号。当您使用$i时,您可能也不想包含/dir/部件,因为它包含在您的glob中。

+0

我让你们建议的修改,并得到以下错误:**用户@主持人:命令〜/文档/ Python的$ ./script.sh 次序错误。 错误的命令序列。 (本地文件)(远程文件) 错误的命令序列。 错误的命令序列。 (本地文件)(远程文件)** – maksaraswat 2012-04-24 16:13:47

0

如果我没有记错,ncftp可以采取通配符参数:

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

如果您还没有安装它,它在您的操作系统的标准回购可能可用。

+0

'lftp'也可以做到这一点(它有一个'mput'命令做一个单一的,多文件)。 – 2012-04-24 15:29:55

+0

此外,我不认为你的命令在这里使用ASCII模式,使它不同于原始脚本。 – 2012-04-24 15:38:09

+0

当然,期待OP做一些*小小的工作是公平的...... :) – 2012-04-24 15:52:42

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

谢谢大家的所有建议。它确实有帮助。我已将脚本更改为Charles所建议的内容,并在执行时遇到以下错误:用户名@主机:〜/ Documents/Python $ ./script.sh 错误的命令序列。 错误的命令序列。 (本地文件)(远程文件) 错误的命令序列。 错误的命令序列。 (本地文件)(远程文件) – maksaraswat 2012-04-24 15:59:51

+0

@ user1354065 FTP实现有所不同,因此没有一个脚本可以保证可以跨所有脚本工作。我可以建议你试试lftp版本吗? – 2012-04-24 16:17:14

+0

@ user1354065 ...在审查时表示 - 可变资本化是不一致的;该名称被分配给'$ File',但是'$ FILE'被取消引用。对于未导出到环境中的变量,使用全大写实际上与惯例相反,所以我更新了它以使用全小写。 – 2012-04-24 16:21:06

0

首先,我没有在问题中明确自己的道歉。我的实际任务是将文件从本地文件夹复制到SFTP站点,然后将文件移动到存档文件夹。由于SFTP由供应商托管,因此我无法使用密钥共享(供应商限制)。另外,如果在shell脚本中使用SCP,则需要输入密码,因此我必须使用SSHPASS。但是,对于CentOS,SSHPASS位于Ubuntu回购站中安装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