0

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

我似乎无法让它工作。任何帮助深表感谢。

谢谢,马扬克

4

4 回答 4

1

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

if [ -f "$i" ]; then

回想一下,这[实际上是一个命令,如果它不这样显示,它将无法被识别。

而且......如果你像这样单引号(在for)你的glob,它不会被扩展。那里没有引号,但使用$i. 您可能也不想/dir/在使用时包含该部分,$i因为它包含在您的 glob 中。

于 2012-04-24T15:22:27.997 回答
0

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

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

如果您还没有安装它,它可能在您的操作系统的标准存储库中可用。

于 2012-04-24T15:28:16.553 回答
0

First, the literal, fixing-your-script answer:

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

Next, the easy way:

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

(yes, lftp expands the wildcard internally, rather than expecting this to be done by the outer shell).

于 2012-04-24T15:35:22.497 回答
0

首先,我很抱歉没有让自己清楚地回答这个问题。我的实际任务是将文件从本地文件夹复制到 SFTP 站点,然后将文件移动到存档文件夹。由于 SFTP 由供应商托管,我无法使用密钥共享(供应商限制。此外,如果在 shell 脚本中使用 SCP 将需要输入密码,因此我必须使用 SSHPASS。SSHPASS 在 Ubuntu 存储库中,但是对于 CentOS,它需要从这里安装

当前线程以及如何使用 Bash 脚本中的密码运行 sftp 命令?确实让我更好地理解了如何编写脚本,我将在这里分享我的解决方案:

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

感谢大家的所有回复!——马扬克

于 2012-05-02T16:35:20.697 回答