2013-07-16 126 views
6

這可能之前已經問過,我是PHP新手,並且盡力學習儘可能多,但這實際上已經拋出了我。通過sftp從遠程服務器下載PHP

基本上我想知道的是,我將如何使用PHP代碼將它從遠程服務器下載到本地位置。它可以下載所有的文件,而不僅僅是一個文件。所以請有人向我展示/解釋我將如何做到這一點?

在此先感謝。

我有什麼到目前爲止

<?php 
$connection - ssh2_connect('example.com', 22); 
ssh2_auth_password($connection, 'username', 'password'); 

$remote_dir="/remote_dir/"; 
$local_dir="/local_dir/"; 

$remote ="$remote_dir"; 
$stream = ssh2_exec($connection, $remote); 
stream_set_blocking($stream,true); 
$command=fread($stream,4096); 

$array=explode(\n,$command); 

$total_files=sizeof($array); 

for($i=0;$i<$total_files;$i+++){ 
    $file_name=trim($array[$i]); 
    if($file_name!=''{ 
     $remote_file=$remote_dir.$file_name; 
     $local_file=$local_dir.$file_name; 

     if(ssh2_scp_recv($connection, $remote_file,$local_file)){ 
      echo "File ".$file_name." was copied to $local_dir<br />"; 
     } 
    } 
} 
fclose($stream); 
?> 

我覺得我的$遠程= 「$ remote_dir」;是錯誤的,說實話我有$文件名,當我想要整個目錄,這是迄今爲止我所有。

+3

發佈您到目前爲止所做的事情,並且不要忘記更換任何敏感信息(如果有)。 – Prix

+0

剛剛添加了迄今爲止我所擁有的。就像我說的我不知道它是對的還是不是隻在幾周前開始使用PHP,但我可能在我的頭上。 – user2589167

+0

已發佈樣本希望你喜歡,因爲你是新來的Stackoverflow [**我也建議你去旅行到Stackoverflow之旅,以瞭解如何最好地使用這個網站,這將幫助你很大程度上未來的問題。** ](http://stackoverflow.com/about) – Prix

回答

11

這裏是如何讀取文件夾並下載其所有的文件一個小代碼:

<?php 
$host = 'localhost'; 
$port = 22; 
$username = 'username'; 
$password = 'password'; 
$remoteDir = '/must/be/the/complete/folder/path'; 
$localDir = '/can/be/the/relative/or/absolute/local/path'; 

if (!function_exists("ssh2_connect")) 
    die('Function ssh2_connect not found, you cannot use ssh2 here'); 

if (!$connection = ssh2_connect($host, $port)) 
    die('Unable to connect'); 

if (!ssh2_auth_password($connection, $username, $password)) 
    die('Unable to authenticate.'); 

if (!$stream = ssh2_sftp($connection)) 
    die('Unable to create a stream.'); 

if (!$dir = opendir("ssh2.sftp://{$stream}{$remoteDir}")) 
    die('Could not open the directory'); 

$files = array(); 
while (false !== ($file = readdir($dir))) 
{ 
    if ($file == "." || $file == "..") 
     continue; 
    $files[] = $file; 
} 

foreach ($files as $file) 
{ 
    echo "Copying file: $file\n"; 
    if (!$remote = @fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r')) 
    { 
     echo "Unable to open remote file: $file\n"; 
     continue; 
    } 

    if (!$local = @fopen($localDir . $file, 'w')) 
    { 
     echo "Unable to create local file: $file\n"; 
     continue; 
    } 

    $read = 0; 
    $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}"); 
    while ($read < $filesize && ($buffer = fread($remote, $filesize - $read))) 
    { 
     $read += strlen($buffer); 
     if (fwrite($local, $buffer) === FALSE) 
     { 
      echo "Unable to write to local file: $file\n"; 
      break; 
     } 
    } 
    fclose($local); 
    fclose($remote); 
} 

您也可以恢復此代碼(它不會複製目錄)

while (false !== ($file = readdir($dirHandle))) 
{ 
    if ($file == "." || $file == "..") 
     continue; 

    echo "Copying file: $file\n"; 
    if(!ssh2_scp_recv($connection, $remoteDir . $file, $localDir . $file)) 
     echo "Could not download: ", $remoteDir, $file, "\n"; 
} 

如果不使用遙控器上的文件夾的完整路徑是行不通:

opendir("ssh2.sftp://{$stream}{$remoteDir}") 
+0

好吧,看起來我沒有近在咫尺,感謝這個 – user2589167

+0

if(!$ remote = @fopen(「ssh2.sftp:// {$ stream}/{$ remoteDir}/{$ file}「,'r'))//注意斜線 –

0

更新:我很好地糾正,這不使用sftp,而是使用ftps。這裏有一個討論using PHP to do SFTP的Stackoverflow鏈接。

PHP docs已經涵蓋了你應該爲此需要的大部分。下面是在遠程目錄獲取的內容列表的例子:

<?php 
// set up basic connection 
$ftp_server = "example.com"; 
$conn_id = ftp_ssl_connect($ftp_server); 

// login with username and password 
$ftp_user_name = "myuser"; 
$ftp_user_pass = "mypass"; 
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 
ftp_pasv($conn_id, true); 
// check connection 
if ((!$conn_id) || (!$login_result)) { 
     echo "FTP connection has failed!"; 
     echo "Attempted to connect to $ftp_server for user $ftp_user_name"; 
     exit; 
    } else { 
     echo "Connected to $ftp_server, for user $ftp_user_name"; 
    } 

$buff = ftp_rawlist($conn_id, '.'); 
var_dump($buff); 
ftp_close($conn_id); 
?> 
+0

感謝您的快速回復!因此,使用這個我可以檢查目錄中所有內容的列表,並且使用ftp_ssl與使用SFTP相同? – user2589167

+0

是的。這會給你一個目錄中所有文件的列表,並且你使用的是SSL SFTP –

+1

不,它們不是一回事,SFTP是SSH文件傳輸協議,而FTP over SSL也被稱爲FTP安全和FTP-SSL,這裏有一篇很好的文章https://www.eldos.com/security/articles/4672.php – Prix

相關問題