如何解决使用expect脚本调用sftp上传文件时因6次登录失败导致账户被锁定
我编写了一个expect脚本,在其中调用sftp上传文件,并将sftpuser sftppass sftpip传递给脚本。在 shell 中,我使用相同的正确参数调用此脚本,它将成功上传文件五次。而在第六回合,它报告了以下错误: 帐号因 6 次登录失败而被锁定
我怀疑我每次都输入了正确的密码,为什么系统将其视为登录失败?
expect 脚本如下所示:
#!/usr/bin/expect -f
set loginuser [lindex $argv 0]
set loginpass [lindex $argv 1]
set ipaddr [lindex $argv 2]
set remote_dir [lindex $argv 3]
set put_file [lindex $argv 4]
set timeout 300
set cmd_prompt "sftp>"
#-------------------------------------------------- login by ssh
spawn sftp $loginuser@$ipaddr
set timeout 300
expect {
-re "Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
} -re "assword:" {
send "$loginpass\r"
} -re "Permission denied,please try again." {
exit
} -re "Connection refused" {
exit
} timeout {
exit
} eof {
exit
}
}
expect {
-re "assword:" {
send "$loginpass\r"
}
-re $cmd_prompt {
send "\r"
}
}
exec sleep 1
expect {
-re $cmd_prompt {
send "cd $remote_dir\r"
}
}
#exec sleep 1
#expect {
#-re $cmd_prompt {
#send "ls\r"
#}
#}
exec sleep 1
expect {
-re $cmd_prompt {
send "put $put_file\r"
}
}
expect {
-re $cmd_prompt {
send "exit\r"
}
}
expect eof
#interact
在 shell 中调用此脚本的命令如下所示: ./autoftp.sh sftpuser sftpuserpass 172.11.11.11 上传./test.dat
解决方法
要查看到底发生了什么,请使用 -d
调试标志运行 expect 并仔细研究结果输出。
其他一些观察:
- 您所有的期望模式都有
-re
标志,这意味着将它们视为正则表达式,但它们实际上并不是正则表达式,除了第一个,其中问号会被误解。您应该使用-ex
标志进行精确匹配。 - 除非您安装了非常旧的 Expect/Tcl,否则五行 [lindex $argv *] 可以压缩为
lassign $argv loginuser loginpass ipaddr remote_dir put_file
。 - Expect 有自己的
sleep
函数,因此您不需要exec sleep 1
只需要sleep 1
。 - 与其重复密码处理,不如在匹配
"Are you sure you want to continue connecting (yes/no)?"
时将处理程序更改为
{
send "yes\r"
exp_continue
}
重新启动相同的 expect 命令。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。