免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2151 | 回复: 6
打印 上一主题 下一主题

Net::SCP::Expect模块关于密码的问题,和文件列表取得的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-28 16:39 |只看该作者 |倒序浏览
  1. use Net::SCP::Expect
  2. my $scpe = Net::SCP::Expect->new(host=>$logfrom_Name, user=>$logbase_user, password=>$logbase_pwd, auto_yes=>1, timeout=>60);
  3. $scpe->scp(":".$filePath."$file","$file");
复制代码
取文件时,能正常取到$file,但总是会返如下错误
scp timed out while trying to connect to $host

使用Net::SCP::Expect模块
要求必须有password
  1. croak("No password or identity file. Can't scp") unless $password || $identity_file;
复制代码
而且expect,没有匹配[Pp]assword就会返错。
  1.       unless($scp->expect($timeout,-re=>'[Pp]assword.*?:|[Pp]assphrase.*?:')){
  2.          my $err = $scp->before() || $scp->match();
  3.          if($err){
  4.             if($handler){ $handler->($err); return; }
  5.             else { croak("Problem performing scp: $err"); }
  6.          }
  7.          $err = "scp timed out while trying to connect to $host";
  8.          if($handler){ $handler->($err); return; }
  9.          else{ croak($err) };
  10.       }
复制代码
我尝试用Net::SCP,这个就没问题

但我没法确切知道,scp哪些服务器的时候要密码,哪些不要。
有没有哪个模块可以在需要密码的时候输入密码,不需要的时候不输?

另外我想从远程服务器取文件列表,有没有什么好方法能像本地文件名一样取得通配文件啊
比如说我想取得log.20120228*
本地文件匹配的话,用
  1. glob "log.20120228*";
复制代码
就行,但我尝试下面这个方法,是没法正常取得文件列表的
  1. @fileSet=glob "log.20120228*"
  2. $scpe->scp(":".$filePath."@fileSet","@fileSet");
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-02-28 19:12 |只看该作者
本帖最后由 FangyuanCheng 于 2012-02-28 19:13 编辑

try this package Net::SSH:erl Net::SSH:\"\"erl .

论坛徽章:
0
3 [报告]
发表于 2012-02-28 19:57 |只看该作者
回复 2# FangyuanCheng

是说利用$ssh->cmd($cmd, [ $stdin ])这个方法,在远端服务器上执行scp,将文件传回本地服务器吗?
那远端不是也可能需要输密码吗?

对了,这些服务器都不能使用ftp,所以Net::FTP也不行。。。
   

论坛徽章:
0
4 [报告]
发表于 2012-02-29 09:42 |只看该作者
  1. my $ssh = Net::SSH::Perl->new($host);
  2.     $ssh->login($user, $pass);
复制代码
Net::SSH:erl->new($host, %params),ssh连接参数设置
$ssh->login($user, $pass);
如果不需要输入密码,$ssh->login($user);
到底是否需要输入密码,你可以手动ssh测试下。

论坛徽章:
0
5 [报告]
发表于 2012-02-29 10:06 |只看该作者
expect 两种情况就可以了
如果Ppassword send $pass
如果登陆过了直接操作就可以了

论坛徽章:
0
6 [报告]
发表于 2012-02-29 17:47 |只看该作者
回复 5# ludio333

请教个问题~

  1. $PROMPT ='[$#]';
  2. $cmd="/usr/bin/scp";
  3. eval {$exp = Expect->spawn($cmd,@params) or die "Can't spawn @_:$!\n"};
  4. if($@){
  5.     print "$@\n";
  6.     exit;
  7. }
  8. $exp->log_stdout(0);
  9. ( $pos, $err, $match, $before, $after )=$exp->expect($timeout,
  10.     [ qr/[Pp]assword.*?:|[Pp]assphrase.*?:/ => sub { $exp->send("$logbase_pwd$t"); exp_continue; } ],
  11.     [ qr/\(yes\/no\)\?\s*$/                 => sub { $exp->send("yes$t"); exp_continue; } ],
  12.     [ qr/$PROMPT /                          => sub { print "OK\n"; } ]
  13. );      

  14. $exp->soft_close();
  15. print "err:$err\n";
  16. print "match:$match\n";
  17. print "before:$before\n";
  18. print "after:$after\n";
复制代码
打印结果如下,
err:3:Child PID 21092 exited with status 0
before:
log.2012022901                            100%   60MB  60.3MB/s   00:01   
after:

以前用过命令行的expect工具,这个是能等到$PROMPT的,
但这个Expect模块却会在scp命令结束的时候,立马结束,
因此会出现上面scp的运行结果status 0

$exp->expect()如何能匹配$PROMPT呢?




   

论坛徽章:
0
7 [报告]
发表于 2012-02-29 17:50 |只看该作者
回复 6# tsubasawzj

qr/$PROMPT / $PROMPT后的空格不存在,我刚贴代码的时候,不小心输了个空格


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP