PHP के साथ SFTP कैसे?


83

मैं वेब एफ़टीपी ग्राहकों के लिए कई PHP लिपियों में आया हूं। मुझे PHP में एक वेब एप्लिकेशन के रूप में एक SFTP क्लाइंट को लागू करने की आवश्यकता है। क्या PHP SFTP के लिए समर्थन करता है? मुझे कोई सैंपल नहीं मिला। क्या कोई मुझे इस बारे में सहायता कर सकता है?

जवाबों:


72

PHP में ssh2 स्ट्रीम रैपर (डिफ़ॉल्ट रूप से अक्षम) है, इसलिए आप किसी भी फ़ंक्शन के साथ sftp कनेक्शन का उपयोग कर सकते हैं ssh2.sftp://, जो प्रोटोकॉल के लिए उपयोग करके स्ट्रीम रैपर का समर्थन करता है, जैसे।

file_get_contents('ssh2.sftp://user:pass@example.com:22/path/to/filename');

या - ssh2 एक्सटेंशन का उपयोग करते समय भी

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

Http://php.net/manual/en/wrappers.ssh2.php देखें

एक साइड नोट पर, इस विषय के बारे में पहले से ही काफी प्रश्न हैं:


file_get_contents और file_put_contents दोनों कमाल का काम करते हैं। कभी नहीं पता था कि वे sftp के साथ काम करते हैं और यह sftp सामान में निर्मित की तुलना में बहुत आसान है। धन्यवाद!
जुबेर

3
यहां तक ​​कि जब file_get_contents () का उपयोग करके आपको अभी भी ssh2 एक्सटेंशन (afaik) की आवश्यकता है।
स्टैन

डेबियन / ubuntu पैकेज: apt इंस्टॉल लिबासश 2-1-देव php-ssh2
अजय सिंह

40

Ssh2 फ़ंक्शन बहुत अच्छे नहीं हैं। उपयोग करने के लिए कठिन और अभी तक स्थापित करना कठिन है, उनका उपयोग करके यह गारंटी दी जाएगी कि आपके कोड में शून्य पोर्टेबिलिटी है। मेरी सिफारिश होगी कि phpseclib, एक शुद्ध PHP SFTP कार्यान्वयन का उपयोग करें


3
@indranama क्या आप इसे सही उत्तर के रूप में चिह्नित करेंगे ताकि भविष्य के उपयोगकर्ताओं को आपके लिए सबसे अच्छा काम करने के लिए टिप्पणियों को पढ़ना न पड़े?
Fi होरन

30

मैंने पाया कि "phpseclib" को आपकी इस (SFTP और कई अन्य विशेषताओं) में मदद करनी चाहिए। http://phpseclib.sourceforge.net/

फ़ाइल को सर्वर पर रखने के लिए, बस कॉल करें ( http://phpseclib.sourceforge.net/sftp/examples.html#put से कोड उदाहरण )

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);


1
क्या आप अपने उत्तर को phpseclib 2.0 में अपडेट कर सकते हैं? आपका वर्तमान उदाहरण अप्रचलित है।
मार्टिन प्रिक्रील

2

फ्लाईसिस्टम स्थापित करें:

composer require league/flysystem-sftp

फिर:

use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;

$filesystem = new Filesystem(new SftpAdapter([
    'host' => 'example.com',
    'port' => 22,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
]));
$filesystem->listFiles($path); // get file lists
$filesystem->read($path_to_file); // grab file
$filesystem->put($path); // upload file
....

पढ़ें:

https://flysystem.thephpleague.com/v1/docs/


-1

मैंने एक पूर्ण-पुलिस-प्रदर्शन किया और एक वर्ग लिखा, जो एक बैच फ़ाइल बनाता है और फिर कॉल करता है sftpasystem कॉल करता है। ऐसा करने का सबसे अच्छा (या सबसे तेज़) तरीका नहीं है, लेकिन यह उस चीज़ के लिए काम करता है जिसकी मुझे ज़रूरत है और इसे PHP में अतिरिक्त पुस्तकालयों या एक्सटेंशनों की किसी भी स्थापना की आवश्यकता नहीं है।

यदि आप ssh2एक्सटेंशन का उपयोग नहीं करना चाहते हैं तो जाने का रास्ता हो सकता है


संबंधित धागा है कि मुझे मदद की: groups.google.com/forum/#!topic/comp.security.ssh/_55TdDdUTCw
Quamis
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.