免费注册 查看新帖 |

Chinaunix

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

perl expert模块 调用 echo输出字符串被截断问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-21 23:52 |只看该作者 |倒序浏览
本帖最后由 gx303841541 于 2014-10-21 23:54 编辑

问题:
PC A 上perl脚本通过expert模块ssh到PC B ,调用 echo 输出字符串到文件,但是当字符串较大时总是有一些行丢失或者被截断的问题,莫名其妙,望高手指点迷津:


原字符串:
  1. 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  2. 222222222222
  3. 333333333333
  4. 44444
  5. 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
  6. 666666666666666666
  7. 77777777777777777777777777
复制代码
通过echo 到文件后变成:
  1. 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  2. 222222222222
  3. 33333
  4. 44444
  5. 55555555555555555555
  6. 6666666666
  7. 77777777777777777777777777
复制代码
以下为模拟问题的脚本:
  1. #!/usr/bin/perl

  2. use 5.010;

  3. use Expect;


  4. my @exp_result;
  5. my $handle = exp_open('192.168.2.225', 'password', 'ubuntu');
  6. my $cmd_buff;       


  7. my $test = '
  8. 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  9. 222222222222
  10. 333333333333
  11. 44444
  12. 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
  13. 666666666666666666
  14. 77777777777777777777777777
  15. 8888888888
  16. 99999999999999999999999999999999999999999999999
  17. 0000000000000000000000000
  18. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  19. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  20. ccccccccccccccccccccccccccccccccccccccccccc
  21. ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
  22. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  23. 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  24. 222222222222
  25. 333333333333
  26. 44444
  27. 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
  28. 666666666666666666
  29. 77777777777777777777777777
  30. 8888888888
  31. 99999999999999999999999999999999999999999999999
  32. 0000000000000000000000000
  33. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  34. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  35. ccccccccccccccccccccccccccccccccccccccccccc
  36. ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
  37. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  38. 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  39. 222222222222
  40. 333333333333
  41. 44444
  42. 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
  43. 666666666666666666
  44. 77777777777777777777777777
  45. 8888888888
  46. 99999999999999999999999999999999999999999999999
  47. 0000000000000000000000000
  48. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  49. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  50. ccccccccccccccccccccccccccccccccccccccccccc
  51. ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
  52. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  53. 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  54. 222222222222
  55. 333333333333
  56. 44444
  57. 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
  58. 666666666666666666
  59. 77777777777777777777777777
  60. 8888888888
  61. 99999999999999999999999999999999999999999999999
  62. 0000000000000000000000000
  63. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  64. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  65. ccccccccccccccccccccccccccccccccccccccccccc
  66. ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
  67. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  68. 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  69. 222222222222
  70. 333333333333
  71. 44444
  72. 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
  73. 666666666666666666
  74. 77777777777777777777777777
  75. 8888888888
  76. 99999999999999999999999999999999999999999999999
  77. 0000000000000000000000000
  78. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  79. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  80. ccccccccccccccccccccccccccccccccccccccccccc
  81. ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
  82. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  83. 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  84. 222222222222
  85. 333333333333
  86. 44444
  87. 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
  88. 666666666666666666
  89. 77777777777777777777777777
  90. 8888888888
  91. 99999999999999999999999999999999999999999999999
  92. 0000000000000000000000000
  93. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  94. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  95. ccccccccccccccccccccccccccccccccccccccccccc
  96. ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
  97. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  98. ';


  99. my $test1 = "123";

  100.     $handle->expect(0);
  101.         $handle->clear_accum();
  102.     $handle->send("ls -l\n");
  103.     @exp_result = $handle->expect(2, '-re', 'tftpboot#');
  104.     $cmd_buff = $handle->exp_before.$handle->exp_match.$handle->exp_after;
  105.     $cmd_buff .= $handle->clear_accum();
  106.     if (!defined($exp_result[0]))
  107.     {
  108.         print("expect /'tmp#'/ TIMEOUT!");
  109.     }
  110.     $handle->expect(0.001);
  111.     $cmd_buff .= $handle->clear_accum();


  112.         print "------------------------\n";

  113.     $handle->expect(0);
  114.         $handle->clear_accum();
  115.     $handle->send("echo -e \"$test\" > test.cfg\n");
  116.     @exp_result = $handle->expect(2, '-re', 'tftpboot#');
  117.     $cmd_buff = $handle->exp_before.$handle->exp_match.$handle->exp_after;
  118.     $cmd_buff .= $handle->clear_accum();
  119.     if (!defined($exp_result[0]))
  120.     {
  121.         print("expect /'tmp#'/ TIMEOUT!");
  122.     }
  123.     $handle->expect(0.001);
  124.     $cmd_buff .= $handle->clear_accum();




  125. ##########################################################
  126. sub exp_open(){
  127.        
  128.         my ($host, $password, $expect_pattern) = @_;
  129.         $handle = Expect->new;
  130.         $handle->raw_pty(1);
  131.        
  132.         $handle = Expect->spawn("ssh $host");
  133.         $handle->log_file("exp.log");
  134.         $handle->log_stdout(1);
  135.        
  136.         print("ssh [$host] [$password] [$expect_pattern]\n");


  137.         my $ret = $handle->expect(10,[
  138.                                                 qr/password:/i,
  139.                                                 sub {
  140.                                     my $self = shift ;
  141.                                     $self->send("$password\n");
  142.                                                                 exp_continue;
  143.                             }
  144.                          ],
  145.                          [
  146.                                                 'connecting (yes/no)?',
  147.                                                 sub {
  148.                                     my $self = shift ;
  149.                                                                 $self->send("yes\n");
  150.                                                                 exp_continue;
  151.                              }
  152.                          ],
  153.                          [
  154.                                                 "$expect_pattern",
  155.                                                 sub {
  156.                                                                 my $self = shift ;
  157.                                                                 $self->clear_accum();
  158.                                                                 $self->expect(0.001);
  159.                                                                 $self->clear_accum();
  160.                                                                 $self->send("cd /tftpboot\n");
  161.                              }
  162.                          ]
  163.                      );
  164.     if (!defined($ret))
  165.     {
  166.         die("TIMEOUT! [$!]");
  167.     }       


  168.     $handle->send("\n");
  169.     my @exp_result = $handle->expect(2, '-re', 'tftpboot#');
  170.     if (!defined($exp_result[0]))
  171.     {
  172.         die("exec CMD FAILED!! [$!]");
  173.     }
  174.    


  175.         $handle->clear_accum();
  176.         $handle->expect(0.1);
  177.         $handle->clear_accum();
  178.         return $handle;
  179. }
复制代码

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
2 [报告]
发表于 2014-10-22 07:26 |只看该作者
终端是有宽度的,你echo的时候就折断了。
要是不需要交互,就不用expect了。

论坛徽章:
0
3 [报告]
发表于 2014-10-22 09:08 |只看该作者
哦?但是被截断的不一定是最长的行哦!还有就是字符串内容较少时,即便最长的行业没有被截断,这个怎么解释呢?回复 2# laputa73


   

论坛徽章:
0
4 [报告]
发表于 2014-10-22 13:49 |只看该作者
你好,你的意思是expect的问题是吧?那我想要在A机上跑脚本到B上执行还有别的办法吗?回复 2# laputa73


   

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
5 [报告]
发表于 2014-10-22 22:26 |只看该作者
回复 4# gx303841541


    如果你不需要交互性的命令,可以配置key方式认证,然后直接"ssh  $ip  ''echo aaaaa'"这样
   如果没法配key,必须密码登录,用expect登录也没问题。

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
6 [报告]
发表于 2014-10-22 22:35 |只看该作者
你是说输出到文件里面的内容缺了?
那就是在传递$test时丢失了
试试$exp->raw_pty(1);

论坛徽章:
0
7 [报告]
发表于 2014-10-24 14:15 |只看该作者
$exp->raw_pty(1);这个已经有了!
不过我加了 $exp->log_stdout(1); 后倒是正常了!不过不懂怎么回事。。。。




回复 6# laputa73


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP