Perl CGI, использующий system () для запуска ssh и передачи очищенных переменных

Я ищу способ, чтобы 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 root@172.16.4.10: fprintd-enroll -f");
exit 0;
}
 if ($sides == "right"){
 system($finger, $guy |  "sudo ssh root@172.16.4.11: fprintd-enroll -f");
exit 0;
}

Но я продолжаю получать такие ошибки, как: «Произошла ошибка при чтении ответа CGI (ответ не получен)»

Есть ли лучший способ сделать это между двумя ящиками 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;
}
0
25.06.2017, 14:28
1 ответ

Я создал быструю HTML-форму для выполнения следующего кода.Хотя это и не полная переработка; и определенно не полный, он работает. Обратите внимание на добавление строк print $q->header(...)перед строками print $q->start_html(...). Если бы мне нужно было закончить его очистку, я бы удалил вызовы dieи заменил их чем-то похожим на то, что делается для ввода неправильного числа. В некоторых случаях вместо вызова die вы можете захотеть отправить ответ HTML-сервера об ошибке (5xx) для неудачных подключений/входов по ssh. Повторяющиеся многострочные участки кода, вероятно, следует поместить в функцию. Я также не создавал более чистый вывод HTML для часов, которые не были левымиили правыми, как я уже сказал, это не то, что я считаю полной программой. При написании CGI вам нужно осознать тот факт, что вывод на самом деле не является терминалом или консолью. Вы должны фиксировать почти все возможные сбои (логины, подключения, запросы, вывод команд и т. д.) и создавать HTML (и, возможно, обновлять заголовки, чтобы вернуться к исходной форме или другой веб-странице) соответственно.

#!/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;
}
0
28.01.2020, 04:44

Теги

Похожие вопросы