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

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

我使用 perl CGI 创建了一个程序,在其中调用位于远程位置的服务器脚本。为此,我使用了 OpenSSH。但是当我从我的终端运行此脚本时,它运行良好,我的远程机器脚本也正常运行。但是当我从浏览器执行此操作时,它不起作用。我使用了以下脚本。

#!/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 错误日志的日志

[2014 年 6 月 27 日星期五 12:11:57] [错误] [客户端本地主机] 权限被拒绝 (publickey、gssapi-keyex、gssapi-with-mic)。\r,引用者: http://XXXX/cgi-bin1/test.cgi

答案1

CGI 脚本通常以与 Web 服务器相同的用户身份运行 - 通常是用户名wwwdatawww。由于您的密钥文件被限制在您的用户名 下,因此huzefaWeb 服务器无法访问它。

如果您允许 Web 服务器用户使用您自己的 ssh 密钥,那么有人可能会在您的 Web 服务器中发现安全漏洞,然后使用您的密钥登录到您有权使用该密钥访问的任何服务器。您可能不希望出现这种情况。

有几种方法可以解决这个问题,而不会造成巨大的安全漏洞。最简单的方法是为此特定用途设置单独的 ssh 密钥:

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

答案2

Web 服务器进程归apache用户所有,而不是root

  1. 确保apache用户无需密码即可访问其他服务器

  2. SELinux 应该被禁用

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

相关内容