2015-07-10 143 views
1

我需要不断地通过FTP自动发送文件。最初,我只是有一个脚本,它为FTP提供了stdin,但是意识到每次我这样做,我都需要关闭然后重新打开服务器和客户端之间的连接。重新连接需要比实际发送文件更多的时间。我试着通过制作一个单独的脚本来打开连接并运行一个脚本来循环发送文件来避免这种情况。在bash脚本中循环使用FTP

问题如下:运行连接脚本后,ftp会自动断开连接。这是连接脚本。

#!/bin/bash 

HOST='192.168.1.2' 
USER='user' 
PASSWD='passwd' 

echo "open $HOST 
user $USER $PASSWD 
ascii" > /tmp/ftp.$$ 

ftp -ivn < /tmp/ftp.$$ >> ftplog.txt 
rm /tmp/ftp.$$ 

并且这是发送文件的脚本。

#!/bin/bash 
echo "put localfile.txt remotfile.txt" > /tmp/ftp.$$ 
ftp -ivn < /tmp/ftp.$$ >> ftplog.txt 
rm /tmp/ftp.$$ 

连接脚本打开连接正常,但一旦运行就关闭它。任何方式来避免这种情况?

我应该说明我没有上传文件列表,而是一个由另一个脚本更新并在更新后发送的文件。这一个文件尽可能接近实时地反复发送。

+0

嗨,这似乎不必要的复杂性在里面扔在这里。为什么让3个脚本通过输入/输出重定向一个接一个地执行,而您只需使用内置函数将脚本参数化为FTP? –

+0

你能深入一点吗?我愿意接受其他解决方案,只是为了避免每次发送文件时不断关闭和重新打开我的连接。 –

+0

您可以使用FTP的mput在一个连接中上传多个文件,但为了自动执行此操作,所有文件都应位于单个文件夹中 –

回答

1

可以upoload一个文件夹中的所有文件与下面的脚本

#!/bin/bash 

HOST='your host' 
USER="your user" 
PASSWD="pass" 
REMOTEPATH='/upload' 

function usage(){ 
    echo "Usage $0 <folder>" 
} 

function ftp(){ 
    ftp -n $HOST <<END_SCRIPT 
    quote USER $USER 
    quote PASS $PASSWD 
    cd $REMOTEPATH 
    lcd $1 
    mput * 
    quit 
    END_SCRIPT 
} 

if [[ $# -ne 1 ]] 
    then 
     usage 
    else 
     ftp $1 
     exit 0 
fi 
+0

如果我正在上传许多不同的文件,这将是一个不错的选择。但是,我期待在每次更新其他程序时上传单个文件 - 实质上是将远程计算机上的文件与本地计算机上的文件同步。这不是一组同时上传的文件,而是在许多不同的时间点发送单个文件。 –

+0

那么为什么不使用rsync? –

+0

rsync绝对是一个选项。我认为rsync可能不会像ftp那样快,即使使用ftp打开和关闭连接,只是因为ssh会减慢速度。我会给他们两个时间,并找出答案。 –