您的位置:首页 > 编程语言 > Python开发

python---pexpect使用ftp下载文件

2017-12-25 18:36 567 查看
python—pexpect使用ftp下载文件

root@kali:~/python/anquangongji#
root@kali:~/python/anquangongji# pwd
/root/python/anquangongji
root@kali:~/python/anquangongji# ls
checkfile.py      dictionary.txt   passwordunix.txt            pexpectftplogin.py      pexpectshhusecommand.py  scanmultports.py  vulnftpbanner.txt
crarkpassword.py  openfiletest.py  pexpectcreaksshpassword.py  pexpectshhnocommand.py  scanerftpbanner.py       vulnbanners.txt
root@kali:~/python/anquangongji#


root@kali:~/python/anquangongji# cat pexpectftplogin.py
#!/usr/bin/python
# --*-- coding:utf-8 --*--

import pexpect

ipAddress = "192.168.40.239"#即将ftp所有登录的远程主机的域名或IP地址
loginName = "test"#登录用户名
loginPassword = "qwe123456"#用户的登陆密码

cmd = "ftp " + ipAddress#拼接ftp命令,ftp后面必须带一个空格
child = pexpect.spawn(cmd)#利用 ftp 命令作为 spawn 类构造函数的参数,生成一个 spawn 类的对象

index = child.expect(["(?i)name","(?i)Unknown host",pexpect.EOF,pexpect.TIMEOUT])# 期望具有提示输入用户名的字符出现
if (index == 0):#匹配到了 "(?i)name",表明接下来要输入用户名
child.sendline(loginName)#发送登录用户名 + 换行符给子程序
index = child.expect(["(?i)password",pexpect.EOF,pexpect.TIMEOUT])#期望 "(?i)password" 具有提示输入密码的字符出现.
if (index != 0):#匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出.
print "ftp login failed"
child.close(force=True)
child.sendline(loginPassword)#匹配到了密码提示符,发送密码 + 换行符给子程序.
index = child.expect(["ftp>","Login incorrect","Service not available",pexpect.EOF,pexpect.TIMEOUT])#期望登录成功后,提示符 "ftp>" 字符出现.
if (index == 0):#匹配到了 'ftp>',登录成功
print "Congratulation!! ftp login correct!!"
child.sendline("bin")#发送 'bin'+ 换行符给子程序,表示接下来使用二进制模式来传输文件
print "getting a file......."
child.sendline("get text.txt")#向子程序发送下载文件text.txt的命令,即在服务器上下载text.txt文件

"""
期望下载成功后,出现 'Transfer complete.*ftp>',其实下载成功后,
会出现以下类似于以下的提示信息:
200 PORT command successful.
150 Opening data connection for rmall (548 bytes).
226 Transfer complete.
548 bytes received in 0.00019 seconds (2.8e+03 Kbytes/s)
所以直接用正则表达式 '.*' 将 'Transfer complete' 和提示符 'ftp>' 之间的字符全省去.
"""

index = child.expect(["Transfer complete. *ftp>",pexpect.EOF,pexpect.TIMEOUT])
#print index
if (index == 2):#匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出.
print "failed to get the file"
child.close(force=True)

print "successfully received the file"#匹配到了 'Transfer complete.*ftp>',表明下载文件成功,打印成功信息,并输入 'bye',结束 ftp session.
child.sendline("bye")

elif (index == 1):
#用户名或密码不对,会先出现 'Login incorrect',然后仍会出现 'ftp>',但是 pexpect 是最小匹配,不是贪婪匹配,
#所以如果用户名或密码不对,会匹配到 'Login incorrect',而不是 'ftp>',然后程序打印提示信息并退出.
print "You entered an invalid login name or password. Program quits!"
child.close(force=True)

else:
#匹配到了 'Service not available',一般表明 421 Service not available, remote server has
#closed connection,程序打印提示信息并退出.
#匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出.
print "ftp login failed! index = " + index
child.close(force=True)

elif index == 1:#匹配到了 "(?i)Unknown host",表示 server 地址不对,程序打印提示信息并退出
print "ftp login failed, due to unknown host"
child.close(force=True)
else:#匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出
print "ftp login failed, due to TIMEOUT or EOF"
child.close(force=True)

root@kali:~/python/anquangongji#


参考:https://www.cnblogs.com/dkblog/archive/2013/03/20/2970738.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python pexpect ftp下载