我想a_web_page.cgi
从我的开发箱运行 Perl CGI 脚本 ( ) ,该脚本从同一文件夹 ( ).1.20
运行 bash 脚本。host_script.sh
然后,该脚本向另一台服务器运行 SSH 命令1.10
,该服务器运行仅返回字符串的脚本。
./host_script.sh
只要我成为me
密钥的所有者,手动运行脚本 ( ) 就可以工作。 (密钥存储在与脚本相同的文件夹中,以供测试。)
默认情况下,密钥的所有者是apache
。
问题是,即使apache
拥有这些密钥,它仍然不起作用。我已经在下面解释过。
这些命令是从 .(开发盒)上的虚拟机运行的192.168.1.20
。我通过 ssh 从本地盒上进入了该虚拟机192.168.1.50
192.168.1.10
目标机与script1.sh
.该脚本返回一个字符串。192.168.1.20
运行 apache Web 服务器并具有a_web_page.cgi
和 的服务器host_script.sh
。 (我正在这个盒子上运行这些命令。)192.168.1.50
我的本地机器不应该真正考虑在内,但将其放在这里以防万一有帮助。
从192.168.1.20
:
ls-a-l
-rwxrwxrwx. 1 me apache 622 Apr 12 09:19 a_web_page.cgi
-rwxrwxrwx. 1 me apache 111 Apr 11 15:14 host_script.sh
-rwx------. 1 apache apache 1675 Apr 11 15:11 test
-rwx------. 1 apache apache 392 Apr 11 15:11 test.pub
vim 主机脚本.sh
#!/bin/bash
ssh -i /var/www/html/dev/remote_script/test [email protected] "/home/user/scripts/script1.sh"
a_web_page.cgi
#!/usr/bin/perl
use strict;
use warnings;
print "Content-type: text/html\n\n";
my $executeString = './host_script.sh';
my $output = `$executeString`;
print "<br />$executeString<br />: $output<br />";
输出 (http://192.168.1.20/dev/remote_script/a_web_page.cgi):
./host_script.sh
:
sudo tail -f /var/log/httpd/error_log
[Tue Apr 12 10:05:22 2016] [error] [client 192.168.1.50] ssh: connect to host 192.168.1.10 port 22: Permission denied\r
(我很困惑为什么客户端IP是我的本地盒子而不是开发盒子)
如果配置
inet addr:192.168.1.20
(如果我通过退出 SSH 会话在本地机器上运行 ifconfig,我将得到192.168.1.50
。)
在这个阶段,我可以看到 SSH192.168.1.10
失败,所以让我们授予我host_script.sh
直接运行并运行它的权限。
sudo chown 我测试
这有效。
./host_script.sh
This is a script on the 192.168.1.10 server!
(这个字符串是从script1.sh
on返回的1.10
,它只是一个 echo 语句)
因此,只要我有权读取密钥,我自己运行脚本就可以正常工作。
-rwx------. 1 me apache 1675 Apr 11 15:11 test
-rwx------. 1 me apache 392 Apr 11 15:11 test.pub
答案1
当您手动运行 ssh 命令时,我假设您已经配置了无密码 ssh 并且 ~user/.ssh 具有必要的密钥。当通过网页运行此程序时,ssh 以用户 apache(或用户 httpd)身份执行,并且 ~apache/.ssh 用于密钥。该用户没有无密码 ssh,因此“权限被拒绝”。
您正在从 192.168.1.50 查看网页,因此会显示在 error.log 中,错误是 ssh(在 192.168.1.20 上运行)无法连接到 192.168.1.10,这是正确的。
解决此问题的各种方法:
- 授予 sudo 访问 apache 的权限,以便 apache 可以作为您自己的用户执行 ssh :类似于“sudo -u me -c 'ssh 192.168.1.10 'script1.sh'”,apache 将使用sudo 切换到你并执行 ssh。
- 让 apache 在两台主机上都有一个主目录,并为 apache 用户配置无密码 ssh,并以 apache 身份执行所有操作。
如果您担心安全问题,您应该寻找替代解决方案,例如 Web 服务。