shell ftp期望智能地将文件从本地复制到ftp服务器

时间:2014-12-09 17:35:18

标签: linux shell ftp expect

我正在编写一个shell脚本来自动执行从远程oracle数据库中提取数据的任务,并将其临时存储在本地机器中的Csvfoder文件夹中。我使用'expect'命令将此Csv文件夹中的所有文件复制到ftp服务器。

Csv文件夹中的这些csv文件具有特定的名称(在下面的示例中,时间戳记有两个连接的系统时间戳) -

例如,从oracle Table1中提取的数据将具有名称ABCD。(timestamp1).csv,在15分钟后脚本再次运行之后,Csvfolder可能具有从oracle中提取的另一个文件Table1将具有名称ABCD。(timestamp2 )的.csv

从oracle Table2中提取的数据将具有名称,例如XYZ。(timestamp10).csv,在15分钟后脚本再次运行之后,Csvfolder可能具有从oracle中提取的另一个文件Table2将具有名称XYZ。(timestamp11)的.csv

现在我的脚本只是使用expect将Csv文件夹中的所有* .csv文件上传到FTP服务器。

但我有一个csv文件名映射到csv文件应该去的FTP服务器上的某些特定目录 -

从上面的示例中,我希望将所有ABCD。(timestampxx).csv文件从本地计算机复制到FTP文件夹HOME_FOLDER / FOLDER_NAME1(唯一文件夹名称)。 我希望将所有XYZ。(时间戳).csv文件从本地计算机复制到FTP文件夹HOME_FOLDER / FOLDER_NAME2(唯一文件夹名称)。在这个例子中,我将有映射:

ABCD files -> should go to HOME_FOLDER/FOLDER_NAME1 of FTP server
XYZ files -> should go to HOME_FOLDER/FOLDER_NAME2 of FTP server

我现在正在shell脚本中使用mput:

expect -c '

set username harry
set ip 100.132.123.44 
set password sally
set directory /home/harry

set csvfilesFolder /Csvfolder/ 

spawn sftp $username@$ip

#Password
expect "*password:"
send "$password\n"
expect "sftp>"
#Enter the directory you want to transfer the files to
send "cd $directory\n"
expect "sftp>"
send -r "mput $csvfilesFolder*\n"


expect "sftp>"
send "exit\n"
interact'

有关如何使用映射将本地计算机上的csv文件复制到FTP服务器上的特定目录的任何建议吗?

1 个答案:

答案 0 :(得分:1)

而不是:

send -r "mput $csvfilesFolder*\n"

你想要

# handle ABCD files
send "cd $directory/FOLDER_NAME1\r"
expect "sftp>"
send "mput $csvfilesFolder/ABCD.*.csv\r"
expect "sftp>"

# handle XYZ files
send "cd $directory/FOLDER_NAME2\r"
expect "sftp>"
send "mput $csvfilesFolder/XYZ.*.csv\r"
expect "sftp>"

通常情况下,我会使用\r来模拟"点击输入",但我猜\n有效。

使用expect eof代替interact来结束期望脚本。