如何让阿帕奇做ssh


How to let apache to do ssh

我想使用 exec 从我的 php 中的远程服务器运行一些命令。喜欢这个:

<? php
exec('ssh user@remote_server command');
?>

我的帐户可以使用公钥/私钥访问该remote_server的ssh,但不能使用apache。请注意,我对任何一台机器都没有根访问权限。为"apache"用户生成SSH密钥的所有答案都需要root访问权限。

我的建议:使用phpseclib,一个纯粹的PHP SSH实现。 例如。

<?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');
?>

Web 服务器进程归 apache 用户所有,而不是 root 用户。

  1. 确保 apache 用户无需密码即可登录远程服务器

  2. 应该禁用 SE Linux。 指

我会尝试:

$identity_file = '/home/you/.ssh/id_rsa'; // <-- replace with actual priv key
exec('ssh -i ' . $identity_file . ' user@remote_server command');

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

缺点是现在Apache用户可以读取您的私钥,这意味着任何其他站点也可以像Apache用户一样运行。 但即使您为 Apache 用户创建了私钥,也是如此。 为了获得更好的安全性,请参阅关于使用 suPHP 或 suExec 以特定用户身份运行 PHP。

如果没有root访问权限,这是一个坏主意。为了确保 Apache 的用户可以看到您的私钥,您必须使其具有全球可读性:没有 root 就无法chown www-data:www-data,因此不仅 Apache 能够看到它,系统上的每个用户都可以看到它。因为这是一个坏主意,OpenSSH 默认情况下不允许它 - 如果您的私钥具有不合理的打开文件权限,它将拒绝运行。

我强烈建议不要这样做。如果你真的需要能够让PHP使用SSH密钥运行远程命令,你需要一个具有root访问权限的人来设置更安全的东西,沿着你的链接行。

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

使用 SSH2。http://php.net/manual/en/book.ssh2.php