Apache用户帐户无密码访问服务器 - Ubuntu

时间:2013-10-31 17:13:35

标签: php apache ssh rsync

我遇到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命令时,它在mod_php下的Apache中运行。通常,Apache作为自己的用户帐户运行,独立于使用服务器的真实用户。因此,Apache内部的PHP无法使用我生成的密钥。

因此我尝试以Apache用户身份登录(我认为它是 www-data )。但大多数文章都说默认情况下 www-data 没有密码,无法以 www-data 的身份登录。

谢谢。

2 个答案:

答案 0 :(得分:5)

我终于找到了解决方案。感谢所有帮助过我的人。

问题是Apache用户无法访问我的密钥。因此,我必须为Apache用户生成SSH密钥(它是www-data),尽管它不那么安全。首先以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);
?>

答案 1 :(得分:1)

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

Rsync不允许您直接指定identiy文件,但您可以将参数传递给基础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');