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