0

1 つのフォルダーから複数のファイルを 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ように(で)グロブを一重引用符で囲んだ場合、それは展開されません。引用符はありませんが、使用する場合は二重引用符で囲みます$i。グロブに含まれているため、/dir/使用時にその部分を含めたくない場合もあります。$i

于 2012-04-24T15:22:27.997 に答える
0

まず第一に、質問で自分自身を明確にしないことについての私の謝罪。私の実際のタスクは、ファイルをローカルフォルダーからSFTPサイトにコピーしてから、ファイルをアーカイブフォルダーに移動することでした。SFTPはベンダーによってホストされているため、キー共有を使用できません(ベンダーの制限。また、シェルスクリプトで使用する場合は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 に答える
0

私が間違っていなければ、ncftpワイルドカード引数を取ることができます:

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

まだインストールしていない場合は、OS の標準リポジトリで利用できる可能性があります。

于 2012-04-24T15:28:16.553 に答える
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 はワイルドカードを外部シェルによって行われることを期待するのではなく、内部で展開します)。

于 2012-04-24T15:35:22.497 に答える