perl访问ftp_使用Perl进行安全的网站访问

perl访问ftp

我承认我不是最有经验的Perl程序员。 幸运的是,当我陷入困境时,我知道我可以向众多书籍,杂志文章,网站,新闻组和邮件列表寻求帮助。 尽管我可以处理所有事情,但是始终无法获得一项关键信息。 无论从哪里看,我都找不到使用Perl和LWP从安全站点获取网页的理想解决方案。

经过许多痛苦和磨难之后,我终于编写了一个脚本来自己完成登录过程的自动化。 一路上,我注意到其他人也在努力解决类似的问题。 即使有所不同,我一次又一次看到的基本问题是: 在世界范围内,如何使用Perl将用户名和密码发送到网站? 我自己终于找到了解决方案,我希望可以一​​劳永逸地回答这个问题。

硬的东西第一

如果您打算与安全的网站进行通信,则会话URL将以HTTPS而不是HTTP开头。 不幸的是,LWP(Perl中的WWW库)模块不支持HTTPS。 要通过安全的HTTP会话建立通信,您需要安装一个名为Crypt :: SSLeay的模块。 在CPAN上很容易找到这个模块(请参阅参考资料 ),但是由于我是在Windows上开发的,因此对我没有太大帮助。

Windows上几乎所有的Perl程序员都使用ActiveState中的Perl。 该程序包已编译并与其他Window应用程序类似地安装。 来自ActiveState的Perl最好的部分是Perl软件包管理器(PPM)。 简单地键入ppmC:\Perl\Bin提示和ppm的启动。 从那里,您可以搜索已经为Windows编译的任何Perl模块,并Swift安装它。 不幸的是,默认的ActiveState存储库中找到的大多数模块都非常旧或根本不可用,Crypt :: SSLeay就是这种情况。 尝试从ppm提示符下搜索Crypt :: SSLeay,您会收到一条不错的错误消息: No matches for 'Crypt::SSLeay'; see 'help search'. No matches for 'Crypt::SSLeay'; see 'help search'.

但是请不要失望-已经为Windows编译的Crypt :: SSLeay确实存在。 您只需要查看其他模块存储库。

查找并安装Crypt :: SSLeay

我不知道为什么ActiveState无法提供Crypt :: SSLeay。 我确实知道您可以在加拿大的存储库中找到它,然后从ppm提示符下安装该模块。 除了输入install Crypt::SSLeay您还需要输入:

install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd

正确键入命令,安装将顺利进行。 但是,出现印刷错误,您又收到另一条错误消息: Error: Failed to download <your typographical error here>

除两个DLL之外,Crypt :: SSLeay会自动安装您需要的所有内容。 在安装过程中,系统将提示您添加libeay32.dll和ssleay32.dll。 出现提示时回答是。 您需要这两个文件。

有了它,您就可以进行最困难的工作(即找到并安装Windows的Crypt :: SSLeay),并且可以开始编写代码了。

让生活更轻松

向安全站点发送用户名和密码是下一个障碍。 尽管仅使用LWP就可以实现此目标,但是编写脚本来与页面进行交互似乎更直观,这与使用常规浏览器的方式类似,或者至少尽可能接近。

我写了一些脚本并将它们的摘要贴到listserv libwww@perl.org上寻求帮助后,我下了休息。 有人给我回信说:“嘿,如果您只使用WWW :: Mechanize,它将容易得多。” 因此,我再次去了CPAN调查他们的建议。

快速阅读了文档,并解决了登录安全网站的奥秘。 WWW :: Mechanize模块允许您与网站交互,就像使用Web浏览器一样。 它使您可以跟踪链接并填写表格。 该模块正是我需要的,您也需要它。 这是获取方法。

  1. 搁置您的代码并打开命令窗口(您知道,它使您回到DOS的美好时光)。
  2. 转到您的C:\ Perl \ bin目录,然后键入ppm 。 Perl软件包管理器将启动,并在ppm提示符ppm>处离开。
  3. 在ppm提示符下,键入search WWW::Mechanize 。 搜索返回几个匹配项。 您想要一个简单地说WWW::Mechanize (在我的搜索中,列表中的第一个匹配项)。
  4. 要安装该模块,请键入install 1 (如果搜索将WWW :: Mechanize关联为其他编号,请输入该编号而不是1)。

WWW ::机械化行动

安装完成后,转到CPAN并阅读WWW :: Mechanize模块的文档(请参阅参考资料 )。 您还将在在线文档中找到一些很棒的代码段和有用的食谱示例。 为了帮助您入门,我编写了一个快速的WWW :: Mechanize示例。 清单1中的脚本检索WWW :: Mechanize模块文档页面并将其转储到名为output.html的文件中。

清单1.使用WWW :: Mechanize
1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. my $url = "http://www.cpan.org";
5. my $searchstring = "WWW::Mechanize";
6. my $outfile = "out.htm";
7. my $mech = WWW::Mechanize->new();
8. $mech->get($url);
9. $mech->follow_link(text => "CPAN modules, distributions, and authors", n => 1);
10. $mech->form_name('f');
11. $mech->field(query => "$searchstring");
12. $mech->click();
13. my $output_page = $mech->content();
14. open(OUTFILE, ">$outfile");
15. print OUTFILE "$output_page";
16. close(OUTFILE);

该脚本很简单,可能很容易解释,但是下面是每一行的简要介绍:

  • 第2行和第3行是最重要的USE语句。 USE strict强制您声明所有变量,并降低使用子过程(在上面的示例中不存在)时Perl误解您的意图的风险。 USE WWW::Mechanize允许您使用先前安装的模块。
  • 第4行将脚本中稍后使用的URL分配给$url 。 是否要转到其他网站? 首先更改$url
  • 第5行是在声明的URL中搜索的内容。
  • 第6行将文件名分配给最终输出文件。
  • 第7和8行创建WWW :: Mechanize的新实例,然后使用先前分配的URL对该实例调用GET方法。
  • 第9行假定已接收到该页面,并在该页面上链接了一个已知链接(显然,您可以在此处进行更多的错误检查,但现在,我只想演示如何检索页面)。 链接页面被检索。 由于我以前是使用标准浏览器执行这些步骤的,所以我知道我的下一页以名为“ f”的形式提供了一个搜索字段。
  • 第10行引用了页面上名为“ f”的表单。
  • 第11行为表单字段query分配了我要搜索的搜索字符串。
  • 第12行是虚拟按钮单击,就像您自己在与页面进行交互一样。
  • 第13、14、15和16 $output_page返回的页面的内容分配给$output_page ,打开一个简单的输出文件,将内容写入该文件,然后关闭该文件。

这就是WWW :: Mechanize的基本用法; 现在让我们继续在安全的网站上使用它。

查找安全站点并登录

清单2中,您看到一个脚本示例,在该示例中,我尝试使用Yahoo!®mail登录基于Web的电子邮件帐户。 自己测试一下该脚本,并查看其运行方式。 (显然,此测试需要一个基于Web的电子邮件帐户。)

清单2.登录到安全站点
1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. use HTTP::Cookies;
5. my $outfile = "out.htm";
6. my $url = "https://mail.yahoo.com/";
7. my $username = "your_email_username_here";
8. my $password = "your_account_password_here";
9. my $mech = WWW::Mechanize->new();
10. $mech->cookie_jar(HTTP::Cookies->new());
11. $mech->get($url);
12. $mech->form_name('login_form');
13. $mech->field(login => $username);
14. $mech->field(passwd => $password);
15. $mech->click();
16. my $output_page = $mech->content();
17. open(OUTFILE, ">$outfile");
18. print OUTFILE "$output_page";
19. close(OUTFILE);

注意,大多数脚本与清单1所示的第一个脚本相同; 区别如下:

  • 第4行告诉脚本使用cookie。 安全站点使用cookie进行身份验证。 cookie过程的确切工作方式超出了本文的范围。 现在,只知道您需要cookie支持才能登录到安全的网站。
  • 第6行是安全网站的URL。
  • 第7和8行是Yahoo!的用户名和密码。 邮件帐户。 显然,我没有包含真实的用户名和密码。 您可以在这些行中轻松替换您的帐户信息,因此脚本可以为您工作。
  • 第10行为先前创建的WWW :: Mechanize实例创建一个新的cookie实例。
  • 第12行将表单设置为在先前[创建的] URL登陆页面上指定的名称。
  • 第13和14 passwd loginpasswd属性设置为先前定义的用户名和密码值。 该脚本的其余部分与清单1中的脚本相同。

请记住,通过浏览到yahoo.mail.com并检查URL所到达HTML页面的源,我发现了表单名称和字段loginpasswd

墨菲定律:不起作用

我的脚本能用吗? 当然不是! 我很少让我的Perl脚本在第一次尝试时就可以工作。 但是,失败是进行一些故障排除的机会。

开始进行故障排除的好地方是脚本和网站之间的通信。 为了更好地了解幕后情况,请在Yahoo!的第4行之后添加以下调试行。 清单2的邮件脚本:

use LWP::Debug qw(+);

添加语句后,再次启动脚本。

debug语句将大量信息发送到屏幕。 花点时间尝试理解屏幕上的所有内容。 如果是Yahoo! 邮件脚本,我在屏幕上看到了很多正面信息; 但是,最重要的信息出现在最后:

清单3.调试输出
Line 1:  LWP::UserAgent::send_request: GET 
    https://login.yahoo.com/config/verify?.done=
    http%3a//us.####.mail.yahoo.com/ym/login%3f.rand=###############
Line 2:  LWP::UserAgent::_need_proxy: Not proxied
Line 3:  LWP::Protocol::http::request: ()
Line 4:  LWP::Protocol::collect: read 508 bytes
Line 5:  LWP::UserAgent::request: Simple response: OK

我在清单3中对输出行进行了编号,以便于讨论。 在正常情况下,此类行未编号。 另外,为了保护Yahoo !,我使用数字符号(#)代替了返回的实际数字。 帐户。

注意: 为了更好地查看,第1行被分成多行。 它实际上显示为一行。

对输出进行故障排除

那么您在调试输出中看到了什么? 第1行建议Yahoo! 正在尝试确认某些内容,然后将脚本重定向到另一个位置。 另外,请注意最后的肯定Ok响应,这表示我有所收获。

对与错,脚本在退出之前将其输出写入一个简单HTML文件。 调试输出指示返回了某些内容。 因此,是时候在文本编辑器中打开输出文件并进行查看了。

果然,输出文件包含一些基本HTML代码和一个非常有说服力的消息。

清单4.错误页面输出
<body>
If you are seeing this page, your browser settings prevent you
from automatically redirecting to a new URL. 
<p>
Please 
  <a href="http://us.f319.mail.yahoo.com/ym/login?.rand=###############">click here</a>
  to continue.

脚本由于某种原因未能重定向,但是可以选择继续click here引用。 在这一点上,我看到了解决该问题的快速简便的方法。

快速简便的解决方案

首先,返回到脚本的页面未引用失败的登录。 该页面只是表示无法重定向浏览器, click here继续。 因此,我只需要在第15行之后向脚本中添加一行代码,然后click here选项将脚本带到其最终目的地,如清单5所示。

清单5.最终脚本
1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. use HTTP::Cookies;
5. my $outfile = "out.htm";
6. my $url = "https://mail.yahoo.com/";
7. my $username = "your_email_username_here";
8. my $password = "your_account_password_here";
9. my $mech = WWW::Mechanize->new();
10. $mech->cookie_jar(HTTP::Cookies->new());
11. $mech->get($url);
12. $mech->form_name('login_form');
13. $mech->field(login => $username);
14. $mech->field(passwd => $password);
15. $mech->click();
16. $mech->follow_link(text => "click here", n => 1);	
17. my $output_page = $mech->content();
18. open(OUTFILE, ">$outfile");
19. print OUTFILE "$output_page";
20. close(OUTFILE);

只要脚本继续检索重定向页面,Yahoo! 邮件继续提供相同的重定向失败消息,我的快速简便的解决方案可以解决问题。 显然,并非所有安全网站都像Yahoo!那样响应。 做。 准备好自己做一些侦探工作,以使登录脚本正常工作。

安全登录清单

我向您展示了一个Perl脚本,该脚本解决了登录安全网站的奥秘。 总而言之,这是使用Perl构建成功,安全的网站登录脚本的必备清单:

  • 以Crypt :: SSLeay开头 :通常通过HTTPS登录到安全站点。 您需要此模块才能使其成为可能。 你可以找到它已经从加拿大TheoryX服务器编译为Windows(参见相关主题 )。
  • 添加WWW :: Mechanize :使您的生活更轻松,并使用此模块,该模块使您可以通过轻松地跟踪链接和填写表单(登录到安全站点的重要部分)来编写模仿网站交互的代码。
  • 使用Cookie :安全的Web交易使用Cookie。 您需要use语句打开它们,以使其在脚本中自动工作。
  • 启用调试 :当事情无法按预期进行时,请use LWP::Debug qw(+);启用调试use LWP::Debug qw(+); 该语句向您的屏幕发送大量信息; 但是,如果您有耐心,输出将非常有帮助。
  • 生成输出文件 :将最终输出或脚本中每个页面检索点之后的输出转储到简单HTML文件中并进行检查。 该文件的内容清楚地显示了脚本从其“获取”请求中获得的回报。

将此清单应用于您的脚本,您将很快使用Perl自动访问安全的网站。


翻译自: https://www.ibm.com/developerworks/web/library/wa-perlsecure/index.html

perl访问ftp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值