通过 Perl / Sh 脚本 SSH 到另一个虚拟机失败。手动工作

通过 Perl / Sh 脚本 SSH 到另一个虚拟机失败。手动工作

我想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.shon返回的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 服务。

相关内容