2012-05-10 23 views

回答

4

我的推荐:使用phpseclib, a pure PHP SSH implementation。例如。

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('www.domain.tld'); 
if (!$ssh->login('username', 'password')) { 
    exit('Login Failed'); 
} 

echo $ssh->exec('pwd'); 
echo $ssh->exec('ls -la'); 
?> 
1

我会尝试:

$identity_file = '/home/you/.ssh/id_rsa'; // <-- replace with actual priv key 
exec('ssh -i ' . $identity_file . ' [email protected]_server command'); 

,看看你是否可以这样进行身份验证。您必须确保身份文件可以被Apache读取。

缺点现在是Apache用户可以读取你的私钥,这意味着任何其他网站运行的Apache用户也可以。但即使您为Apache用户创建私钥,情况也是如此。为了提高安全性,请参阅使用suPHP或suExec将PHP作为特定用户运行。

+0

不起作用。我需要使身份文件可以被apache读取。这意味着读取其他(r + o)。显然ssh不喜欢太开放的文件模式! –

0

这是没有root权限的坏主意。为了确保Apache的用户可以看到你的私钥,你必须让它成为世界可读的:没有root用户,你不能使用chown www-data:www-data,所以Apache不仅能够看到它,系统中的每个用户都能够至。因为这是一个坏主意,OpenSSH默认不会允许它 - 如果你的私钥有不合理的开放文件权限,它将拒绝运行。

我强烈建议不要这样做。如果你真的需要能够使用SSH密钥运行远程命令,你需要有root用户才能根据你的链接设置更安全的东西。

一个更安全的替代方案将是写在目标机器,接受包含您定义的密码的HTTP请求,执行一个预先定义的指令,并返回输出上的PHP脚本。如果此脚本安全编写并且只能执行一个预定义的命令,那么攻击者可以执行的命令与您的命令一样 - 只要此脚本的密码与您自己的任何密码都不相同即可。它不一定是一个命令,如果你小心的话,它甚至可以采用一些参数:重要的一点是你不允许远程用户在目标机器上执行任意的命令。如果您确定您希望能够运行的命令没有潜在危害,并且您的脚本不包含允许其他命令运行的编码错误,那么这不是一个好主意。

3

Web服务器进程由apache用户不是root拥有。

  1. 确保Apache用户有密码较少登陆到远程服务器

  2. SE Linux应该被禁用。 Refer