在PERL中使用SSH运行bash命令

时间:2015-01-11 17:56:21

标签: html bash perl ssh

请耐心等待。我对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" ");

提前感谢你

2 个答案:

答案 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);