【问题标题】:Apache user account passwordless access to the server - UbuntuApache 用户帐户无密码访问服务器 - Ubuntu
【发布时间】:2013-10-31 17:13:34
【问题描述】:

我在this 问题中遇到了同样的问题。如果我再解释一遍,我可以使用 rsync 将我的本地数据与服务器同步,而无需密码(我使用了 SSH 密钥)。但是当我在 PHP 中使用 exec() 函数时,它不起作用。

提出上述问题的人已经自己给出了答案。他说这可以通过允许 Apache 用户帐户无密码访问服务来完成。所以我的问题是如何为 Apache 用户帐户提供对服务器的无密码访问

我的 PHP 代码是:

echo exec('rsync -aze  --progress --size-only /var/tmp/src/File01 serveruser@mycloud.com.lk:/var/tmp/dest/File01');

PS:我使用我的典型用户帐户(假设用户名是'bob')登录我的机器,并使用 ssh-keygen -t rsa 生成 ssh 密钥。然后 bob 可以无密码访问服务器。

但是,当我运行 PHP 命令时,它在 Apache 中运行在 mod_php 下,并且通常 Apache 作为自己的用户帐户运行,独立于使用服务器的现实世界的人。因此,我生成的密钥不适用于 Apache 内的 PHP。

因此我尝试以 Apache 用户身份登录(我认为是 www-data)。但是大部分文章都说www-data默认没有密码,不能以www-data的身份登录。

谢谢。

【问题讨论】:

标签: php apache ssh rsync


【解决方案1】:

我终于找到了解决办法。感谢所有帮助我的人。

问题是 Apache 用户无法访问我的密钥。因此,我不得不为 Apache 用户(它是 www-data)生成 SSH 密钥,尽管它不是那么安全。首先以 root 身份登录。

mkdir /var/www/.ssh
chown -R www-data:www-data /var/www/.ssh

现在生成 SSH 密钥,如下所示。它会将您的私钥和公钥保存在/var/www/.ssh 文件夹中:

sudo -u www-data ssh-keygen -t rsa

现在你应该得到这样的东西:

root@sampath-Vostro-1520:/var/www/.ssh# sudo -u www-data ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/www/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /var/www/.ssh/id_rsa.
Your public key has been saved in /var/www/.ssh/id_rsa.pub.
The key fingerprint is:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx www-data@machine-Vostro-1520
The key's randomart image is:
+--[ RSA 2048]----+
|       ...o...o..|
|           o..  o|
|         + .. .+o|
|         .  .*o+o|
|     ++ S   ..B..|
|         o . E + |
|        . . o o  |
|             . . |
|                 |
+-----------------+

现在将您的公钥复制到远程服务器:

sudo -u www-data ssh-copy-id -i /var/www/.ssh/id_rsa.pub username@myserver.com

现在这应该可以了。 :-)

<?php
$c='rsync -azv /source/folder/path/ username@myserver.com:/destination/folder/path';
exec($c,$data);
print_r($data);
?>

【讨论】:

  • 你是最棒的!我已经找了几个小时的路了,多亏了你,我终于做到了。有趣的是,我和 2 小时前有同样的想法,但我忘记了 rsa_key 归 unix 系统用户所有。而且我只是将 rsa_key 从我的主目录复制到 www-data 之一,但我不知道为什么它不起作用。 :) 再次感谢您。
  • 我试过了,但我总是得到 mktemp: failed to create file via template ‘/root/.ssh/ssh-copy-id_id.XXXXXXXXXX’: Permission denied
【解决方案2】:

通常,您的密钥是通过 SSH 代理加载的,使其自动可用,您可以手动指定身份文件,而不是使用它。如果您生成要使用的密钥,只要它可以被 apache 读取,那么它就可以使用。

Rsync 不允许您直接指定身份文件,但您可以将参数传递给底层 SSH 调用:

echo exec('rsync -az -e "ssh -i /var/www/key.pri" --progress --size-only /var/tmp/src/File01 serveruser@mycloud.com.lk:/var/tmp/dest/File01');

【讨论】:

  • 感谢您的回答。但这不起作用。我不知道这有什么问题。但是以下命令在终端上再次运行良好,但不适用于 exec()。 rsync -az -e "ssh -i /var/www/id_rsa" --progress /var/tmp/src/File01 serveruser@mycloud.com.lk:/var/tmp/dest/File01
  • 运行时有输出吗?如果密钥不可用或无法访问服务器,应该给你一个错误。
  • 没有。它没有给出任何信息。 echo 不打印任何内容。
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 2017-11-17
  • 2015-02-24
  • 1970-01-01
相关资源
最近更新 更多