Shell脚本加载多个FTP文件

时间:2012-04-24 15:19:28

标签: shell syntax-error ftp-client

我正在尝试将多个文件从一个文件夹上传到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     

当我尝试执行时,它会给我以下错误:

username@host:~/Documents/Python$ ./script.sh 
./script.sh: line 22: syntax error: unexpected end of file

我似乎无法让这个工作。非常感谢任何帮助。

谢谢, Mayank

4 个答案:

答案 0 :(得分:1)

这是抱怨,因为您的for循环没有done标记来指示循环结束。您还需要if中的更多空格:

if [ -f "$i" ]; then

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

并且...如果你单独引用你的全球(在for),它将不会被扩展。没有引号,但在使用$i时使用双引号。您可能还不希望在使用/dir/时包含$i部分,因为它包含在您的glob中。

答案 1 :(得分:0)

如果我没弄错的话,ncftp可以使用通配符参数:

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

如果您尚未安装它,则可能在您的操作系统的标准仓库中提供。

答案 2 :(得分: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在内部扩展通配符,而不是期望外壳完成此操作)。

答案 3 :(得分: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 - user@ftp.com << !
    cd foldername/foldername
    put $file
 bye
 !
mv $file /somedir/test
fi
done

感谢大家的所有回复! --Mayank