2

I need to write a php script that can connect to a sftp server, get the list of the directories and files in the server, and later download a specific file. I was given the ppk file (I assume this is the private key authentication file) for the authentication part.

I read in a few places that curl can do this.. but I'm not entirely sure how to do it. I tried copy pasting the code from here but my understanding was the code utilizes public keyfile instead of private key.

So here's what I tried to connect to the sftp server

$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
curl_setopt($ch, CURLOPT_URL, 'sftp://233.42.20.115/');
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE,'megpxl_private.ppk');
curl_setopt($ch, CURLOPT_SSH_AUTH_TYPES,CURLSSH_AUTH_AGENT);
$output = curl_exec ($ch);
print_r($output);

The output prints nothing.. so what should I do to actually connect to this sftp properly?

====Update==== Now I'm trying to use phpseclib. Here's my code:

require_once 'phpseclib/Net/SSH2.php';
require_once 'phpseclib/Net/SFTP.php';
require_once 'phpseclib/Crypt/RSA.php';
require_once 'phpseclib/Crypt/RC2.php';
require_once 'phpseclib/Crypt/RC4.php';
require_once 'phpseclib/Math/BigInteger.php';

set_include_path('phpseclib/Net/');

$privatekey = file_get_contents('sftp_private.txt');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents("private.ppk"));
$sftp = new Net_SFTP('233.12.20.225', 22);
if (!$sftp->login("myUserName", $rsa)) {
    exit('Login Failed');
}
print_r($sftp);

But all I got was this message:

No compatible server to client encryption algorithms found in /var/www/html/phpseclib/Net/SSH2.php on line 1375

=============Update: This works!=================

require_once 'phpseclib/Net/SSH2.php';
require_once 'phpseclib/Net/SFTP.php';
require_once 'phpseclib/Crypt/RSA.php';
require_once 'phpseclib/Math/BigInteger.php';

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

$privatekey = file_get_contents('sftp_private.txt');

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents(mykey.ppk"));
$sftp = new Net_SFTP('223.22.20.122', 22);
if (!$sftp->login("usrPMEGPXLtxn", $rsa)) {
    exit('Login Failed');
}

print_r($sftp->nlist()); // == $sftp->nlist('.')
print_r($sftp->rawlist()); // == $sftp->rawlist('.')
Community
  • 1
  • 1
imin
  • 4,504
  • 13
  • 56
  • 103

2 Answers2

2

If you use http://phpseclib.sourceforge.net/ then you don't need to install any additional libraries on the server...

include('Net/SFTP.php');

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

print_r($sftp->nlist()); // == $sftp->nlist('.')
print_r($sftp->rawlist()); // == $sftp->rawlist('.')

(from http://phpseclib.sourceforge.net/new/sftp/examples.html)

Barry
  • 3,303
  • 7
  • 23
  • 42
  • I tried using phpseclib but all I got was "No compatible server to client encryption algorithms found in phpseclib/Net/SSH2.php on line 1375". Btw I've updated with the phpseclib code that I use for this. – imin May 04 '16 at 17:45
  • That is a shame, I've used it and it worked very easily – Barry May 04 '16 at 18:01
  • 1
    This works, I just need to add set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); – imin May 05 '16 at 15:51
-1

PHP already has a native ssh extension... look if your host have this extension active in a regular phpinfo();

You are looking for: http://php.net/manual/en/wrappers.ssh2.php

And more specific: http://php.net/manual/en/function.ssh2-exec.php

From there you can do something like this:

// Generate connection
$conn = ssh2_connect('your.site.com', 22);
ssh2_auth_password($conn, 'username', 'password');

// Set the connection setup for files
$sftp = ssh2_sftp($connection);

// List the Directory (if this is a UNIX system)
$ls = ssh2_exec($conn, 'path/to/dir ls');
echo $ls; // or create an array with a foreach function.

// To read the file
$file = fopen("ssh2.sftp://$sftp/path/to/file", 'r');
// you can grab the file using the $file bytes.

// Or just download the file.
ssh2_scp_recv($conn, '/path/remote/filename', '/path/local/filename');

Hope this helps.

eljamz
  • 106
  • 8