无法从perl CGI脚本运行远程scipt

我创build了一个程序,使用Perl的CGI,我打电话给我在远程位置的服务器脚本。 为此我使用了OpenSSH。 但是,当我从我的terminal运行这个脚本它工作正常我的远程机器脚本也正常运行。 但是,当我从浏览器这样做是行不通的。 我已经使用下面的脚本。

#!/usr/bin/perl use warnings; use strict; use CGI; use Net::OpenSSH; use warnings; our $cgi = new CGI; use Net::OpenSSH; my %opts = ( user => "UNAME", #password => "MYPASSWORD", strict_mode => 0, ); my $ssh = Net::OpenSSH->new("MY SERVER_IP",%opts,master_opts => [-i => "MY KEY FILE"], async => 1); $ssh->system("/root/test.sh") or die "remote command failed: " . $ssh->error; 

以下是来自Apache错误日志的日志

[fri Jun 27 12:11:57 2014] [error] [client localhost] Permission denied(publickey,gssapi-keyex,gssapi-with-mic)。\ r,referer: http:// XXXX / cgi-bin1 / test的CGI

CGI脚本通常以与运行Web服务器相同的用户身份运行 – 通常是用户名wwwdatawww 。 由于您的密钥文件受限于您自己的用户名huzefa ,因此networking服务器无法访问它。

如果您允许Web服务器用户使用您自己的ssh密钥,那么在您的Web服务器中发现安全漏洞的人可能会使用您的密钥,然后使用该密钥login到任何您有权访问的服务器。 你可能不想要这个。

有几种方法可以避免打开巨大的安全漏洞。 最简单的就是为这个特定的用途设置一个单独的ssh密钥:

  1. 生成一个新的SSH密钥,并将其放置在Web服务器用户可以访问的目录中
  2. 将公钥部分复制到服务器上的authorized_keys文件中。
  3. 编辑authorized_keys文件,以便Web服务器使用的公钥只能用于运行该脚本。 为了提高安全性,请将其限制为仅允许来自服务器IP地址的连接。 它应该看起来像这样:
 from =“10.1.2.3”,no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command =“/ root / test.sh”ssh-dss AA ..... 

Web服务器进程由apache用户拥有而不是root

  1. 确保apache用户没有密码访问其他服务器

  2. SELinux应该被禁用

请参阅: http : //wccandlinux.blogspot.in/2016/07/how-to-run-ssh-command-from-apache.html