我使用 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 服务器相同的用户身份运行 - 通常是用户名wwwdata
或www
。由于您的密钥文件被限制在您的用户名 下,因此huzefa
Web 服务器无法访问它。
如果您允许 Web 服务器用户使用您自己的 ssh 密钥,那么有人可能会在您的 Web 服务器中发现安全漏洞,然后使用您的密钥登录到您有权使用该密钥访问的任何服务器。您可能不希望出现这种情况。
有几种方法可以解决这个问题,而不会造成巨大的安全漏洞。最简单的方法是为此特定用途设置单独的 ssh 密钥:
- 生成新的 ssh 密钥并将其放在 Web 服务器用户可以访问的目录中
- 将密钥的公共部分复制到
authorized_keys
服务器上的文件中。 - 编辑 authorized_keys 文件,以便 Web 服务器使用的公钥只能用于运行该脚本。为了提高安全性,请将其限制为仅允许来自服务器 IP 地址的连接。它应该看起来像这样:
来自“10.1.2.3”,无端口转发,无X11转发,无代理转发,无pty,命令“/root/test.sh” ssh-dss AA.....
答案2
Web 服务器进程归apache
用户所有,而不是root
。
确保
apache
用户无需密码即可访问其他服务器SELinux 应该被禁用
参考 :http://wccandlinux.blogspot.in/2016/07/how-to-run-ssh-command-from-apache.html