2013-07-16 5 views
6

के माध्यम से रिमोट सर्वर से PHP डाउनलोड यह पहले से पूछा जा सकता है, मैं 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"; गलत है, और ईमानदार होने के लिए मुझे पूरी फ़ाइल चाहिए जब मुझे $ filename मिल गया है, यह सब मेरे पास अब तक है।

+3

जो आपने अभी तक किया है पोस्ट करें और यदि कोई हो तो किसी भी संवेदनशील जानकारी को प्रतिस्थापित करना न भूलें। – Prix

+0

अभी जोड़ा गया है जो मुझे अब तक मिला है। जैसे मैंने कहा कि मुझे पता नहीं है कि यह सही है या न केवल कुछ हफ्ते पहले PHP शुरू किया था, लेकिन शायद मैं यहां अपने सिर पर हूं। – user2589167

+0

आपने एक नमूना आशा पोस्ट की है जिसे आप पसंद करते हैं, क्योंकि आप स्टैक ओवरफ्लो के लिए नए हैं [** मैं आपको यह सलाह देता हूं कि इस वेबसाइट का सबसे अच्छा उपयोग कैसे करें, जो आपको भविष्य के प्रश्नों के बारे में बहुत मदद करेगा। ** ** मैं आपको स्टैक ओवरफ्लो टूर की यात्रा करने की भी सलाह देता हूं। ] (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

करने के लिए PHP का उपयोग करने पर एक और एसओ चर्चा के लिंक के साथ अपना जवाब अपडेट किया है, ऐसा लगता है कि मैं करीब नहीं था, इस – user2589167

+0

के लिए धन्यवाद (! $ Remote = @fopen ("ssh2.sftp: // {$ स्ट्रीम}/{$ remoteDir}/{$ file} ", 'r')) // स्लैश नोटिस करें –

0

अपडेट: मुझे दयालु रूप से सही किया गया था कि यह sftp का उपयोग नहीं करता है, बल्कि इसके बजाय ftps का उपयोग करता है। using PHP to do SFTP पर चर्चा करने वाला एक स्टैक ओवरफ्लो लिंक यहां दिया गया है।

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 का उपयोग एक एसएफटीपी का उपयोग करने जैसा ही है? – user2589167

+0

हां। यह आपको निर्देशिका में सभी फाइलों की एक सूची देगा और आप एसएसटीपी –

+1

नहीं हैं, नहीं, वे एक ही बात नहीं हैं, एसएफटीपी एसएसएच फाइल ट्रांसफर प्रोटोकॉल है जबकि एसएसएल पर एफ़टीपी को एफ़टीपी सिक्योर और एफ़टीपी-एसएसएल भी कहा जाता है, यहां एक अच्छा लेख है https://www.eldos.com/security/articles/4672.php – Prix

संबंधित मुद्दे