我创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服务器相同的用户身份运行 – 通常是用户名wwwdata
或www
。 由于您的密钥文件受限于您自己的用户名huzefa
,因此networking服务器无法访问它。
如果您允许Web服务器用户使用您自己的ssh密钥,那么在您的Web服务器中发现安全漏洞的人可能会使用您的密钥,然后使用该密钥login到任何您有权访问的服务器。 你可能不想要这个。
有几种方法可以避免打开巨大的安全漏洞。 最简单的就是为这个特定的用途设置一个单独的ssh密钥:
authorized_keys
文件中。 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
。
确保apache
用户没有密码访问其他服务器
SELinux应该被禁用
请参阅: http : //wccandlinux.blogspot.in/2016/07/how-to-run-ssh-command-from-apache.html