我想使用 exec 从我的 php 中的远程服务器运行一些命令。像这样:
<? php
exec('ssh user@remote_server command');
?>
我的帐户可以使用公钥/私钥访问该 remote_server 的 ssh,但不能使用 apache。请注意,我没有对这两台机器的 root 访问权限。为“apache”用户生成 SSH 密钥的所有答案都需要 root 访问权限。
我想使用 exec 从我的 php 中的远程服务器运行一些命令。像这样:
<? php
exec('ssh user@remote_server command');
?>
我的帐户可以使用公钥/私钥访问该 remote_server 的 ssh,但不能使用 apache。请注意,我没有对这两台机器的 root 访问权限。为“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 拥有。
确保 apache 用户没有密码登录到远程服务器
SE linux 应该被禁用。 参考
如果没有 root 访问权限,这是一个坏主意。为了确保 Apache 的用户可以看到您的私钥,您必须使其对全世界都可读:没有 root 您不能chown www-data:www-data
,因此 Apache 不仅可以看到它,系统上的每个用户都可以. 因为这是一个糟糕的主意,所以 OpenSSH 默认不允许它运行 - 如果您的私钥具有不合理的打开文件权限,它将拒绝运行。
我强烈建议不要这样做。如果您确实需要能够让 PHP 使用 SSH 密钥运行远程命令,那么您将需要具有 root 访问权限的人按照您的链接设置更安全的东西。
一个更安全的替代方法是在目标机器上编写一个 PHP 脚本,该脚本接受一个包含您定义的密码的 HTTP 请求,执行一个预定义的命令并返回输出。如果此脚本是安全编写的并且只能执行一个预定义的命令,那么攻击者所能做的就是运行与您相同的命令 - 只要此脚本的密码与您自己的任何密码不同。它不需要完全是一个命令,如果你小心的话,它甚至可以接受一些参数:重要的一点是你不允许远程用户执行任意命令目标机器上的命令。如果您确定您希望能够运行的命令没有潜在的危害,并且您的脚本不包含允许运行其他命令的编码错误,那么这不是一个坏主意。
我会尝试:
$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。