1

Web フロントエンドを使用して Net::OpenSSH を使用してリモート コマンドを実行しています。コマンド ラインではコマンドが正常に返されますが、Web ブラウザでは何も表示されません。私は無駄に数時間の調査を行った - 何かアイデアはありますか?

例を示すコードを次に示します (一部は明らかな理由で削除されています)。

#!/usr/bin/perl -w
use strict;
use CGI ':standard';
use Net::OpenSSH;
# Here in the code is just the header and standard tags
print "1";
print "2"; # both display
my $ssh = Net::OpenSSH->new($host, user => $uname, key_path => $key); # all works
$ssh- error and die "Can't ssh to host" . $ssh->error;
print "3";
$ssh->system("uname -a") or
die "remote command failed: " . $ssh->error;
my @lsa = $ssh->capture("ls -a");
$ssh->error and
die "remote ls command failed: ". $ssh->error;

print "4";
print "5"; 
print @lsa; # won't display in browser, just terminal/CLI

乾杯!

4

3 に答える 3

1

私はCGI.pmを維持しています。単純なスクリプトに次の追加をお勧めします。

  1. 他の何かを印刷する前に、標準のHTTPヘッダーを印刷しますprint header()
  2. 次の行の後にこれを追加しuse CGIます:use CGI::Carp qw(fatalsToBrowser);...ブラウザで実行時の問題を表示します。これらの変更後に出力が得られない場合は、スクリプトが次のコマンドでコンパイルされることを確認してください。perl -cw script.pl
于 2012-08-08T19:22:22.157 に答える
0

おそらく、エラーは標準出力ではなく標準エラーに送られます。その場合、通常はブラウザ ウィンドウではなく、サーバー ログに記録されます。POSIX::dup2おそらく、これを回避するために使用できます。

use POSIX;

# Make sure to send HTTP headers before redirecting streams!

POSIX::close(2);  # close original stderr stream. No more output to apache logs!!!
POSIX::dup2(1,2); # redirect error stream to standard output, so errors will appear in browser.

たとえばいくつかの ssh バイナリのように、perl によって起動されるプロセスは、これらのストリームを継承します。

于 2012-08-09T12:28:25.750 に答える
0

以下は、Debian マシンで動作する最小限の Perl コードです。それを調べて、実際のコードと比較することをお勧めします。

ただし、私の Debian ではそのままでは機能しませんでした。おそらくあまり安全ではないいくつかの決定を下しましたが、それは特定の環境に関するものです。

  • サーバーが実行されているユーザーのホームを書き込み可能にする (/var/www)
  • 事前に ~/.ssh/known_hosts にホストを追加してください
  • 適切なものを見つけるのではなく、 のセキュリティ チェック strict_mode => 0をバイパスするために を使用します(フォルダーと上記のすべてのフォルダーが 0755 以上である必要があるため、使用した /tmp は通常十分ではありません)。Net::OpenSSHctl_dirNet::OpenSSH

それよりもはるかに安全な慣行があると思いますが、私が言ったように、それは環境に固有のものです.

だからコード:

#!/usr/bin/perl
use strict;
use warnings;

use Net::OpenSSH;
use File::Temp qw/ tempdir /;

# necessary minimum for CGI
print "Content-type: text/plain\n\n";

# prepare temp dir
my $temp = tempdir("/tmp/sshme.pl-XXXXXXXX", CLEANUP => 1);

# open SSH session
my %opts = (
    user        => "user",
    password    => "password",
    ctl_dir     => $temp,
    strict_mode => 0            ## NOT recommended - see my comments
);
my $ssh = Net::OpenSSH->new("host", %opts);
$ssh->error
    and die "Couldn't establish SSH connection: ". $ssh->error;

# perform command and print output
my @lines = $ssh->capture("ls")
    or die "remote command failed: " . $ssh->error;
print @lines;
于 2012-08-08T20:20:35.983 に答える