2

我已经尝试过 perl 模块 Net::SSH:Perl 和 Net::OpenSSH 无济于事。X11 转发确实有效,因为如果我执行“ssh root@host”并执行诸如“xterm”之类的 X 应用程序,我会返回一个窗口。

以下是我尝试过的一些事情:

    $self->{'ssh'} = Net::OpenSSH->new("root:PW@".$hostname);
    print $self->{'ssh'}->capture("env"); #The display variable is not set so it won't work
    print $self->{'ssh'}->capture("xterm");

没有

    $self->{'ssh'} = Net::OpenSSH->new("root:PW@".$hostname, master_opts => ['-X' => '']);
    print $self->{'ssh'}->capture("env"); #The display variable is not set so it won't work
    print $self->{'ssh'}->capture("xterm"); #Nope
    print $self->{'ssh'}->capture({master_opts => ['-X']}, "xterm"); #Nope

不,现在是 Net::SSH::Perl

    $self->{'ssh'} = Net::SSH::Perl->new("$hostname", debug=>0);
    $self->{'ssh'}->login("root","pass");
    my ($stdout, $stderr, $exit) = $self->{'ssh'}->cmd("xterm"); #Nope

没有

    $self->{'ssh'} = Net::SSH::Perl->new("$hostname", debug=>0, options=>["ForwardX11 yes"]);
    $self->{'ssh'}->login("root","pass");
    my ($stdout, $stderr, $exit) = $self->{'ssh'}->cmd("xterm"); #Nope

唯一真正有效的是如果我执行以下操作,所以我知道 X11 转发在 Perl 中工作。

    `ssh root@host xterm`

如果可能的话,我宁愿让模块工作,但如果我能以某种方式打开双向管道,与 SSH 通信并在我想要的时候接收数据(类似于我如何 $self->{'ssh'}->cmd()并随时在我的脚本中接收输出),我会这样做。我只是不知道从哪里开始。以前有其他人这样做过吗?

4

1 回答 1

2

的开发版本Net::OpenSSH有一个新的选项forward_X11。这似乎有效:

my $ssh = Net::OpenSSH->new("localhost", forward_X11 => 1);
print $ssh->capture({forward_X11 => 1}, "env"); # includes DISPLAY=localhost...
print $ssh->capture({forward_X11 => 1}, "xclock"); # starts the xclock program

请注意,您必须在构造函数和实际命令上都指定新选项。

另见http://www.perlmonks.org/?node_id=1028837

于 2013-07-17T14:10:37.970 回答