2013-07-17 75 views
2

我嘗試了perl模塊Net :: SSH:Perl和Net :: OpenSSH無濟於事。因爲如果我執行「ssh root @ host」並執行一個X應用程序(如「xterm」),X11轉發功能就會起作用,因爲我得到一個窗口。在Perl中使用X11轉發的SSH

這裏有一些事情我已經試過:

$self->{'ssh'} = Net::OpenSSH->new("root:[email protected]".$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:[email protected]".$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 [email protected] xterm` 

我寧願讓模塊工作,如果可能的,但如果我能以某種方式打開一個雙向管道,用SSH溝通,當我想接收數據(類似於我怎麼可以在$自我 - > {'SSH '} - > cmd()並在我的腳本中隨時接收輸出),我會這樣做。我只是不知道從哪裏開始。其他人之前做過?

+0

「不」的意思,沒有新的窗口打開,但你沒有得到錯誤信息? – innaM

+0

無窗打開。該錯誤總是與DISPLAY變量有關。當X11轉發正在工作時,SSH會創建僞顯示,如localhost:400(這是SSH隧道),並適當設置DISPLAY變量。 –

回答

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

+0

雅我看到了,但我很謹慎安裝開發模塊。 –

+0

那麼,那麼你必須等到穩定的版本... –

+0

啊螺絲它生病使用dev版本。這很容易,它的工作原理。是否可以安裝模塊的多個版本。非常感謝! –