请耐心等待。我对perl很新。我将HTML变量从html表单传递给PERL / CGI脚本。请参阅以下
#!/usr/bin/perl
use strict; use warnings;
use CGI::Carp; # send errors to the browser, not to the logfile
use CGI;
my $cgi = CGI->new(); # create new CGI object
my $name = $cgi->param('servername');
print $cgi->header('text/html');
print "Server name is /n, $servername";
#system("/var/www/cgi-bin/localbashscript $servername");
#system("ssh $servername "remotebashscript" > localfile or display back to html );
基本上从HTML表单中,我需要传递服务器名称。 我尝试使用system命令将servername传递给" localbashscript"运行我的ssh命令。但是,我无法让它发挥作用。有人建议我在PERL中使用SSH,但我不知道该怎么做。
简而言之,我必须在远程服务器($ servername)上调用bash脚本(remotebashscript)并将内容显示回html或至少将其传递给本地文件。在运行remotebashscript之前我需要做的第一件事是设置我的环境变量。这就是我在bash中的表现。我通过获取.profile来设置我的env变量,然后执行remotebashscript并将其重定向到本地文件。
ssh $servername ". ~/.profile;remotebashscript" > localfile
我不知道如何使用perl实现相同的功能并寻求您的帮助。我在下面试过但没有工作
system("ssh $servername ". ~/.profile; remotebashscript" ");
提前感谢你
答案 0 :(得分:3)
请:从不,永远,永远不要在系统调用中使用用户输入,至少不要尝试消毒它们!假设用户不会通过输入字符串来破坏您的系统是一个可怕的错误,这些字符串可以以某种方式逃避您正在尝试做的事情并做其他事情。在这种情况下,类似192.168.0.1 rm -rf /
的内容就足以从ssh服务器中删除所有文件。请注意标准的处理方式,即在执行的命令中永远不会使用用户输入。
有很多模块,甚至是标准模块,Net::SSH
,可以为你做SSH。
答案 1 :(得分:1)
正如Jens建议您使用Net::SSH,这将使您的任务变得简单可靠。
样品:
#always use the below in your Perl script
use strict;
use warnings;
#load the Net::SSH module and import sshopen2 from it
use Net::SSH qw(sshopen2);
#type credentitals and the command you want to execute (this would be your bash script)
my $user = "username";
my $host = "hostname";
my $cmd = "command";
#use sshopen2 to run your command
sshopen2("$user\@$host", *READER, *WRITER, "$cmd") || die "ssh: $!";
#read the result
while (<READER>) { #loop through line by line of result
chomp(); #delete \n (new line) from each line
print "$_\n"; #print the line from result
}
#close the handles
close(READER);
close(WRITER);