免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4324 | 回复: 2

IO::Pty could not connect pty as controlling terminal! [复制链接]

论坛徽章:
0
发表于 2010-08-29 18:56 |显示全部楼层
30可用积分
本帖最后由 lucash 于 2010-08-29 19:08 编辑

在结合使用Net::OpenSSH 和 Expect模块时,遇到的问题。

用Net::OpenSSH 建立一个master ssh connection ,然后用一个叫做open2pty的方法来
打开一个pty供Expect模块使用。
在spawn时出错,提示信息如下:

warning: TIOCSCTTY failed, slave might not be set as controlling terminal: Operation not permitted at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/IO/Pty.pm line 120.
Error: could not connect pty as controlling terminal!

但不知道怎么才能正确的使用IO::Pty中的make_slave_controlling_terminal() 方法来spawn一个子进程。
该方法的说明文档中提示说只能通过fork一个子进程来调用它。不知道该如何使用。

我的出错代码如下:


  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Net::OpenSSH;
  4. use Expect;

  5. my $ssh = Net::OpenSSH->new('192.168.10.100',
  6.                  user       => 'lucash',
  7.                  passwd  => 'lucash'
  8. );
  9. $ssh->error and die "Unable to connect: " . $ssh->error . "\n";
  10. my @cmd = qw(who);
  11. my ($pty,$pid)  = $ssh->open2pty({},@cmd);
  12. my $exp = Expect->init($pty) or die "Can not init pty: $!\n";

  13. $exp->spawn(@cmd) or die "Unable to spawn command: $!\n";

复制代码
加了make_slave_controlling_terminal后还是报错:


  1. my ($pty, $pid)  = $ssh->open2pty({},@cmd};
  2. if ( (my $ppid = fork()) == 0) {
  3.       $pty->slave();
  4.       $pty->make_slave_controlling_terminal();
  5.       my $exp = Expect->init($pty) or die "Can not init pty : $!\n";
  6. }

复制代码
难道是要open2pty得到的那个$pid fork的子进程中make_slave_controlling_terminal()才有用吗?该怎么做呢?

以下是IO::Pty的部分源码:
  1. [font=Verdana]
  2. sub make_slave_controlling_termianl {

  3.     …………………… 部分省略。
  4.    
  5.   # Acquire a controlling terminal if this doesn't happen automatically
  6.   if (defined TIOCSCTTY) {
  7.     if (not defined ioctl( ${*$self}{'io_pty_slave'}, TIOCSCTTY, 0 )) {
  8.       warn "warning: TIOCSCTTY failed, slave might not be set as controlling terminal: $!" if $^W;
  9.     }
  10.   } elsif (defined TCSETCTTY) {
  11.     if (not defined ioctl( ${*$self}{'io_pty_slave'}, TCSETCTTY, 0 )) {
  12.       warn "warning: TCSETCTTY failed, slave might not be set as controlling terminal: $!" if $^W;
  13.     }
  14.   }

  15.   if (not open(\*DEVTTY, "/dev/tty")) {
  16.     warn "Error: could not connect pty as controlling terminal!\n";
  17.     return undef;
  18.   } else {
  19.     close \*DEVTTY;
  20.   }
  21.    return 1
  22. }
复制代码
IO:: Pty的文档还说:
  1. See the try script (also test.pl) for an example how to correctly spawn a subprocess.
复制代码
天哪,这个‘try’ 脚本在哪啊?

搞两天了也没搞定,各位大侠帮帮忙。多谢了。

注:这个部分只是一个脚本中的一小部分,因此暂不考虑抛弃Net::OpenSSH模块的方法

论坛徽章:
0
发表于 2010-08-30 11:37 |显示全部楼层
怎么都没人来帮忙啊

论坛徽章:
0
发表于 2010-08-30 17:23 |显示全部楼层
印象中自己遇见过类似的问题,刚刚特地去翻开自己以前写过的代码看了下
  1. 420     my $session = Net::SSH::Expect->new (
  2. 421         host => "$host",
  3. 422         password=> "$pass",
  4. 423         user => "$user",
  5. 424         raw_pty => 1
  6. 425     );
复制代码
看来自能帮顶了

顺便假设一下:如果我今天我也遇到跟你一样的困境,我想我的Google思线是
首先看有先烈  Google之 "Error: could not connect pty as controlling terminal!" ,5分钟内找不到雷同的解决问题方案,那就可能该不能那么轻浮咯,安静思考下"what is tty",也许就可以找到问题的根源咯,再不行就踏踏实实的看下源码吧:)

以上思路 纯属愚见,望大家共同探讨:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

ITPUB技术栈

ITPUB技术栈:http://z.itpub.net/
ITPUB技术栈是由ITPUB社区打造的垂直于IT领域的知识交流平台,在这里,你既可以是创作者也可以是消费者。如果你的IT生涯丰富多彩,喷薄的个人价值尽可在小栈内体现;如果你渴望找到志同道合的伙伴,拓宽人脉,小栈会是你最好的选择。





点击进入>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP