如何使用CGI和Perl的Net :: OpenSSH模块在远程Linux服务器上执行系统命令?

时间:2016-09-06 20:43:57

标签: linux perl ssh

编辑:首先阅读:我在这里尝试做的是极端隧道视觉的结果,这篇文章可能很有趣,但没有提供信息。您不需要通过SSH连接到自己的服务器来执行命令,我甚至在想什么......

标题几乎说明了一切。我想在Linux服务器(Debian,如果重要)上托管CGI网站,当点击按钮时,在服务器上执行系统命令。我是通过Perl做的,它是Net::OpenSSH模块。

这是问题所在。我可以通过服务器本身的终端运行脚本,但是如果我使用sudo,只能 。命令是否只是“ls”并不重要。不出所料,当点击调用模块的网站上的按钮时,它也不起作用。

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
use Net::OpenSSH;

print("Content-type: text/html\n\n");

print("TEST");

my $ssh = Net::OpenSSH->new('localhost', user => 'myusername', password => 'mypassword');

$ssh->system("ls") or die "ERROR: " . $ssh->error;

print("TEST2");

当使用sudo在终端中运行它时,脚本打印出TEST,然后列出我的主目录(桌面,文档等)中的文件夹,最后列出TEST2

当我不使用sudo时,它只打印TEST,然后显示以下错误消息:

  

错误:无法建立主SSH连接:真实性   目标主机无法建立;远程主机公钥是   可能不会出现在'〜/ .shh / known_hosts'文件中   opensshtest.pl第13行。

我根本不使用SSH密钥,我试图通过将用户名和密码硬编码到脚本中来提供用户名和密码。

此外,在浏览器中打开时,它只打印出第一个TEST

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

再一次,发布这个问题的人。我花了好几个小时试图完成这项工作很有趣,并且在这里发布问题后一小时偶然发现了一个解决方案。但这是:

我已添加user作为创建Net :: OpenSSH对象的附加参数(带有password-Wait的行等)。