您好我正在编写以下脚本以使用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这个脚本,感谢您的支持,我想收到修复它的建议
答案 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发送多个文件,