나는 이전 웹 페이지에서 가져온 변수를 사용하여 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 응답을 읽는 동안 오류가 발생했습니다(응답을 받지 못했습니다)."
두 데비안 상자 사이에 이런 종류의 작업을 수행하는 더 좋은 방법이 있습니까? "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을 생성해야 합니다(그리고 헤더를 새로 고쳐 원래 양식이나 다른 웹 페이지로 돌아갈 수도 있음).
#!/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;
}