繁体   English   中英

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

[英]shell ftp expect to intelligently copy files from local to ftp server

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

Csvfolder中的这些csv文件具有特定的名称(在下面的示例中,时间戳有两个系统时间戳结合在一起)-

例如,从oracle表1提取的数据将命名为ABCD。(timestamp1).csv,在脚本在15分钟后再次运行后,Csvfolder可能会从oracle表1提取的另一个文件将命名为ABCD。(timestamp2).csv

从oracle Table2提取的数据将命名为XYZ。(timestamp10).csv,在脚本在15分钟后再次运行后,Csvfolder可能会从oracle Table2提取的另一个文件名为XYZ。(timestamp11).csv

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

但是我将csv文件名映射到csv文件应转到的FTP服务器上的某些特定目录-

从上面的示例中,我希望将所有ABCD。(timestampxx).csv文件从本地计算机复制到FTP文件夹HOME_FOLDER / FOLDER_NAME1(唯一的文件夹名称)。 我希望将所有XYZ。(timestamp).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:

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服务器上的特定目录?

代替:

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以结束Expect脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM