Perl CGI、system()を使用してsshを起動し、削除された変数を渡します。

Perl CGI、system()を使用してsshを起動し、削除された変数を渡します。

私は以前のWebページから取得した変数を使用してPerlにプログラムを起動させる方法を探しています。これは私の恐ろしいPerlコードです。

#!/usr/bin/perl -w
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use strict;
my $guy = param('number');
$guy =~ s/\D//g;
if ($guy == 0){
    die("Please enter number for employee");
}
my $sides = param('clock');
my $finger =  param('finger');

if ($sides == "left"){
system($finger, $guy |  "sudo ssh [email protected]: fprintd-enroll -f");
exit 0;
}
 if ($sides == "right"){
 system($finger, $guy |  "sudo ssh [email protected]: fprintd-enroll -f");
exit 0;
}

ただし、次のエラーが引き続き発生します。「CGI応答の読み込み中にエラーが発生しました(応答を受信できませんでした)。」

2つのDebianボックスの間にこの種のタスクを実行するより良い方法はありますか? 「ssh」方式を操作する方法はありますか?

ありがとうございます!

編集する: 以下の提案に従って先週コードを変更しましたが、まだ理解していません。

#!/usr/bin/perl -w                                                              
use CGI qw(:standard -debug);                                                 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);                          
use Net::SSH2;                                                                
use strict;                                                                    
my $ssh = Net::SSH2->new();                                                    
my $q = new CGI;                                                              
my $style = get_style();                                                                                                                                  
my $guy = param('number');                                                    
$guy =~ s/\D//g;                                                               
if ($guy == 0){                                                                
    die("Please enter number for employee, broken");                     
}
my $sides = param('clock');
my $finger =  param('finger');

print $q->start_html(
-title => "Enroll Finger Print".
-style => {-code => $style},
);
print $q->h2("Enrolling Finger...");
if ($sides eq "left"){
    $ssh->connect("172.16.4.10") or $ssh->die_with_error;
    $ssh->auth_publickey("root", "../files/id_rsa.pub", "../files/id_rsa") or $ssh->die_with_error;
    my $chan = $ssh->channel;
    $chan->exec("fprintd-enroll  -f ${finger} ${guy}");
    $ssh->disconnect();
    print $q->h2("Sent request for ", $guy,"'s ", $finger);
    print end_html;
    exit 0;
}

if ($sides eq "right"){
    $ssh->connect("172.16.4.11") or $ssh->die_with_error;
    $ssh->auth_publickey("root", "../files/id_rsa.pub", "../files/id_rsa") or $ssh->die_with_error;
    my $chan = $ssh->channel;
    $chan->exec("fprintd-enroll -f ${finger} ${guy}");
    $ssh->disconnect();
    print "Sent request for ", $guy,"'s ", $finger;
    print end_html;
    exit 0;
}
else{
print $q->h4("Timeclock not selected\n");
print $q->h4("Please select a timeclock to use for finger enrollment.");
exit 1;
}

## Subs

sub get_style {
my $style = <<"EOT";
body {
font-family: verdana, arial, sans-serif;
bgcolor: white;
padding-left: 5%;
}
h2 {
colors: purple;
border-bottom: 1pt solid;
}
h4 {
color: blue;
}
EOT
return $style;
}

ベストアンサー1

次のコードを実行するための高速HTMLフォームを作成しました。完全に書き直さなかったけど。確かに不完全、動作します。print $q->header(...)行の前に追加された行を参照してくださいprint $q->start_html(...)。クリーンアップを完了するには、呼び出しを削除し、誤ったdie番号入力に対して行ったものと同様のものと交換します。場合によっては、dieを呼び出すのではなく、SSH接続/ログイン失敗に対するHTMLサーバーエラー応答(5xx)を送信したい場合があります。繰り返される複数行のコードセクションを関数に入れる必要があるかもしれません。また、時計がなかったので、よりきれいなHTML出力を生成できませんでした。または正しい、私が言ったように、それは完全なプログラムだと思うものではありません。 CGIを作成するときは、出力が実際には端末またはコンソールではないことを知っておく必要があります。ほとんどすべての可能な失敗(ログイン、接続、クエリ、コマンド出力など)をキャッチし、それに応じてHTMLを生成する必要があります(そしてヘッダを更新して元のフォームまたは他のWebページに戻ることもできます)。

#!/usr/bin/perl -w                                                              
#
# vi: set ft=perl syntax=perl noai ts=4 sw=4:       
use CGI qw(:standard -debug);                                                 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);                          
use Net::SSH2;                                                                
use strict;                                                                    
my $ssh2 = Net::SSH2->new();                                                    
my $q = new CGI;                                                              
my $formurl = "http://webhost.example.com/testform.html";
my $lefthost = "leftclock.example.com";
my $righthost = "rightclock.example.com";
my $publickey = "/home/user/.ssh/id_rsa2.pub";
my $privatekey = "/home/user/.ssh/id_rsa2";
my $username = "user";

my $style = get_style();                                                                                                                                  
my $guy = $q->param('number');                                                    
$guy =~ s/\D//g;                                                               
if ($guy == 0){                                                                
#    die("Please enter number for employee, broken");                     
    print $q->header( -type => "text/html", -Refresh=>"5; URL=$formurl" );
    print $q->start_html( -title => "Bad Number" );
    print $q->h2("Missing Employee Number");
    print "Please return to the the form and enter employee number<BR>\n";
    print "If you are not redirected in 5 seconds, click on the following link.<BR>\n";
    print $q->a({-href => $formurl},"$formurl");
    print $q->end_html;
    exit 0;
}

my $sides = $q->param('clock');
if ($sides ne "left" && $sides ne "right" ) {
    print $q->header( -type => "text/html", -Refresh=>"5; URL=$formurl" );
    print $q->start_html( -title => "Bad Clock" );
    print $q->h2("Incorrect Clock Chosen");
    print "Please return to the form and enter \"left\" or \"right\" for clock.<BR>\n";
    print "If you are not redirected in 5 seconds, click on the following link.<BR>\n";
    print $q->a({-href => $formurl},"$formurl");
    print $q->end_html;
    exit 0;
}

my $finger =  $q->param('finger');
#
# Add code here to validate value entered for finger
# Follow logic from $sides and $guy above
#

#
# At this point all the field values are validated and we can begin
# to process
#

print $q->header(-type => "text/html" );

print $q->start_html(
-title => "Enroll Finger Print",
-style => {-code => $style},
);
print $q->h2("Enrolling Finger...");
if ($sides eq "left"){
    $ssh2->connect($lefthost) or die;
    if (! $ssh2->auth_publickey($username, $publickey, $privatekey, undef)) {
        print $ssh2->error;
    }
    my $chan = $ssh2->channel;

    $chan->exec("fprintd-enroll  -f ${finger} ${guy}");
    $chan->send_eof;
    while (<$chan>) {
        chomp;
        print "line read: $_</BR>\n";
    }

    $chan->close;

    $ssh2->disconnect();
    print $q->h2("Sent request for " . $guy . "'s " . "$finger");
    print $q->end_html;
    exit 0;
}

if ($sides eq "right"){
    $ssh2->connect($righthost) or die;
    if (! $ssh2->auth_publickey($username, $publickey, $privatekey, undef)) {
        print $ssh2->error;
    }
    my $chan = $ssh2->channel;

    $chan->exec("fprintd-enroll  -f ${finger} ${guy}");
    $chan->send_eof;
    while (<$chan>) {
        chomp;
        print "line read: $_</BR>\n";
    }

    $chan->close;

    $ssh2->disconnect();
    print $q->h2("Sent request for " . $guy . "'s " . "$finger");
    print $q->end_html;
    exit 0;
}
else{
print $q->h4("Timeclock not selected\n");
print $q->h4("Please select a timeclock to use for finger enrollment.");
exit 1;
}

## Subs

sub get_style {
my $style = <<"EOT";
body {
font-family: verdana, arial, sans-serif;
bgcolor: white;
padding-left: 5%;
}
h2 {
colors: purple;
border-bottom: 1pt solid;
}
h4 {
color: blue;
}
EOT
return $style;
}

おすすめ記事