如何使用expect发送目录中包含的几个文件?

时间:2016-10-14 13:20:53

标签: expect

您好我正在编写以下脚本以使用ftp协议自动发送多个文件,我决定使用expect来实现这一点,我试过,以下内容:

#!/usr/bin/expect

定义变量:

set user myUser
set gate myGate
set password myPassword

定义每3分钟更改一次的令牌:

set token [lindex $argv 0]

这是第二个参数,即要发送的文件的名称:

set file [lindex $argv 1]
set server myServer
set password2 myPassword2
spawn ftp ${gate}
expect "some lines of response:"
send "${user}\r"
expect "password:"
send "${password}${token}\r"
expect "ftp>"
send "user myServer\r"
expect "Password:"
send "myPassword2"

将我更改为相应的目录:

send "pwd\r"
send "cd myFolder\r"
expect "successfully changed."

这是出现问题的地方:

send "put ${file}\r"
interact

我按如下方式运行:

expect.exe ftpScript myToken filesToSend/

在尝试使用文件发送目录的部分之前,一切正常:

ftp> myFolder/
250 Directory successfully changed.
ftp> put filesToSend/
filesToSend/: not a plain file.
ftp>

我的文件夹位于存储我的脚本的同一级别:

ls:

filesToSend ftpScript

如果我对名为filesToSend的目录执行ls,它看起来如下:

$ ls
file1  file10  file11  file12  file2  file3  file4  file5  file6  file7  file8  file9

因此,我想感谢任何想法,以及如何改进我的代码,因为我最近开始学习期望,提前感谢您的帮助。

在回答之后,我将脚本复制到了要发送的文件所在的文件夹中,我尝试了:

send "mput ${file}\r"

但是在运行之后:

expect.exe ftpScript token file10  file11  file12

用这三个文件进行测试,我只能在确认后成功发送file10:

mput file10? y
200 PORT command successful [translated to PASV by DeleGate].
150 Ok to send data.
226 File receive OK.

我相信只发送一个文件,因为我使用的方式来获取参数我只有这行来获取参数:

 set file [lindex $argv 1]

我不太确定我是否需要在这里使用一个列表,这就是导致只发送一个文件的原因,只是考虑argv1这个脚本,感谢您的支持,我想收到修复它的建议

2 个答案:

答案 0 :(得分:1)

我相信您可以使用带有通配符而不是mput的{​​{1}}命令来解决您的问题。

修改您的put脚本,按以下方式更改expect行:

put

然后用:

调用
send "mput ${file}\r"

答案 1 :(得分:1)

我解决了以下问题:

如果我们执行:

cd filesToSend

然后我们按如下方式修改脚本:

spawn ftp -i ${gate}

-i flag关闭交互模式,提示确认每个文件。

然后我们使用:

send "mput *\r"

最后,我们能够将所有没有错误的文件发送到命运,只运行:

expect.exe /myPath/ftpScript myToken

我们收到正确命运的所有文件:

file1  file10  file11  file12  file2  file3  file4  file5  file6  file7  file8  file9

感谢所有有用的评论,在研究之后我决定发布我的答案,因为可能有人发现这个脚本对于让他们的生活更轻松有用,谈论使用ftp发送多个文件,