2013-07-16 8 views
6

Dies könnte zuvor gefragt worden, ich bin neu in PHP und ich versuche zu lernen, so viel wie ich kann, aber das hat mich wirklich geworfen.PHP-Download von Remote-Server über sftp

Grundsätzlich, was ich wissen möchte, ist, wie würde ich PHP-Code verwenden, um es zu erhalten, alles von einem Remote-Server an einen lokalen Ort herunterladen. Es bringt alles herunter, nicht nur eine Datei, auf der ich feststecke. Kann mir bitte jemand zeigen/erklären, wie ich das machen würde?

Vielen Dank im Voraus.

Was ich habe bisher

<?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); 
?> 

Ich glaube, mein $ remote = "$ Remote_Dir"; ist falsch, und um ehrlich zu sein, ich habe $ filename, wenn ich das ganze Verzeichnis haben will, das ist alles was ich bisher habe.

+3

Veröffentlichen Sie, was Sie bisher getan haben und vergessen Sie nicht, alle sensiblen Informationen zu ersetzen, falls vorhanden. – Prix

+0

Nur hinzugefügt, was ich bisher habe. wie ich schon sagte, ich weiß nicht, ob es richtig ist oder PHP nicht erst vor ein paar Wochen gestartet hat, aber ich bin wahrscheinlich über meinen Kopf hier. – user2589167

+0

Ich habe ein Sample geposted, das dir gefällt, da du neu bei Stackoverflow bist [** Ich empfehle dir auch, einen Ausflug zur Stackoverflow Tour zu machen, um zu erfahren, wie du diese Website am besten nutzen kannst. ] (http://stackoverflow.com/about) – Prix

Antwort

11

Hier ist ein kleiner Code, wie Sie den Ordner lesen und laden alle seine Dateien:

<?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); 
} 

Sie auch wieder aufnehmen können dieser Code zu (es wird keine Verzeichnisse kopieren):

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"; 
} 

Wenn Sie nicht den vollständigen Pfad auf dem Remote-Ordner verwenden, funktionieren sie nicht:

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

Nun sieht es aus wie ich war keine wo in der Nähe schließen, danke für diese – user2589167

+0

if (! $ Remote = @fopen ("ssh2.sftp: // {$ stream}/{$ remoteDir}/{$ file} ", 'r')) // bemerke den Schrägstrich –

0

Update: Ich wurde freundlicherweise korrigiert, dass dies nicht sftp verwendet, sondern stattdessen ftps verwendet. Hier ist ein Stackoverflow-Link, der using PHP to do SFTP diskutiert.

Die PHP docs decken bereits das meiste ab, was Sie dafür brauchen sollten. Hier ist ein Beispiel für eine Liste der Inhalte im Remote-Verzeichnis holen:

<?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

Danke für die schnelle Antwort! Mit diesem kann ich die Liste von allem im Verzeichnis überprüfen, und die Verwendung von ftp_ssl ist das gleiche wie mit einem SFTP? – user2589167

+0

Ja. Dies gibt Ihnen eine Liste aller Dateien in dem Verzeichnis und Sie verwenden SSL, die SFTP ist –

+1

NEIN sie sind nicht das gleiche, SFTP ist SSH File Transfer Protocol während FTP über SSL auch als FTP Secure und FTP-SSL bekannt, Hier ist ein guter Artikel https://www.eldos.com/security/articles/4672.php – Prix