Apache-2.2

使用 rsync 從 php 腳本內部將文件從本地上傳到遠端伺服器,而無需輸入密碼

  • January 24, 2011

我已經設置了一個公鑰來為我的使用者自動登錄遠端伺服器。

所以這從cli執行沒有任何問題:

rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/;

但是,當我嘗試從 PHP 腳本(在我本地伺服器的網頁上)執行相同的腳本時:

$c='rsync -r -a -v -e --log-file=FILE "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/';

//exec($c,$data);
passthru($c,$data);
print_r($data);

這是我收到的:

2011/01/23 19:18:29 [6401] rsync: connection unexpectedly closed (0 bytes received so far) [sender] 2011/01/23 19:18:29 [6401] 
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7] 

權限 qre 設置如下:

Local:
chmod 600 ~/.ssh/local-rsync-key
chmod 600 ~/.ssh/local-apache-key
chmod 700 ~/.ssh/

Remote:
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh/
chmod 700 ~/

我在 ~/.ssh/authorized_keys 上註冊了兩個密鑰:

user@localserver
apache@localserver

我的想法枯竭了……我想我必須在遠端 /etc/ssh/sshd_config 文件中做其他事情。我在兩台伺服器上都執行 Nginx。謝謝你的幫助。

更新:

雖然我無法獲得 rsync,但這就是我將文件從本地傳輸到遠端的方式:

if($con=ssh2_connect('111.111.11.111',22)) echo 'ok!';
if(ssh2_auth_password($con,'apache','xxxxxx')) echo ' ok!';
if(ssh2_scp_send($con,'localfile','/remotefolder',0755)) echo ' ok!';

本地文件需求:0644 遠端文件夾需求:0775

我還閱讀了以下建議:“我認為您不想“將密鑰複製到 apache 可以訪問它的地方” - 這是違反安全性的。最好將腳本更改為以安全使用者身份執行,然後設置 .ssh伺服器之間無密碼登錄的密鑰。

如果有人知道如何做到這一點,請,這將是很大的幫助。

嘗試-e "ssh -l user -i <keyfile>"

在命令行上執行時,ssh使用 上的密鑰文件$HOME/.ssh/,但在 PHP 下,它是使用 Apache 的使用者執行的,所以它可能沒有$HOME; 更不用說$HOME/.ssh/id_dsa。因此,您要麼明確告訴它要使用哪個密鑰文件,要麼手動創建該目錄及其內容。

引用自:https://serverfault.com/questions/225957