4

I'm having trouble using PHP to SFTP upload files to a remote server. When I use cURL, I'm getting the error described here:

SFTP from PHP - undefined constant CURLOPT_PROTOCOLS and CURLPROTO_SFTP?

I also tried phpseclib as suggested in:

SFTP from within PHP

But when i try phpseclib, i get these errors:

Warning: require_once(Math/BigInteger.php) [function.require-once]: failed to open stream: No such file or directory in /home/john/public_html/test/Net/SSH2.php on line 53

Fatal error: require_once() [function.require]: Failed opening required 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/john/public_html/test/Net/SSH2.php on line 53

I then tried using system commands in php like so, but nothing happened:

<?php
echo system('sftp user@ftp.domain.com');
echo system('password');
echo system('put file.csv');
?>

I also tried

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

ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>

but my php server says ss2_connect is not defined.

I tried to do the following from terminal

scp file.csv user@ftp.remote.com
password

But the server does not allow scp command. I do not have shell access to create ssh keys.

All i can do right now is sftp from terminal and manually upload. But I really want to automate this so a PHP website can do all this.

There aren't many tutorials on how to SFTP upload from PHP. Is it because it's a bad thing to do? If so, what should I be doing? The server I want to upload to only allows sftp connections.

Community
  • 1
  • 1
John
  • 28,573
  • 67
  • 217
  • 373

5 Answers5

6

http://phpseclib.sourceforge.net/documentation/intro.html#intro_usage_correct

Per that, phpseclib's root directory needs to be in your include_path. From that page:

<?php
  set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

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

You should really familiarize yourself with this kind of include technique - it's pretty standard for PEAR libraries and Zend ones.

septianw
  • 101
  • 1
  • 6
dreamafter
  • 172
  • 2
  • 3
1

but my php server says ss2_connect is not defined.

For this error, you should install ssh2 extension on your server's php.

Don Kirkby
  • 41,771
  • 21
  • 173
  • 252
0

Use the built in SSH library. Using the scp function will be easier than initiating a sftp session too.

http://www.php.net/manual/en/function.ssh2-scp-send.php

Byron Whitlock
  • 49,611
  • 27
  • 114
  • 164
  • the server i'm working on says ssh2_connect() is not defined. Also, the remote host i'm connecting to did not allow me to scp file.csv user@remote.server.com – John Nov 19 '09 at 23:13
  • 1
    This probably isn't available by default. You need the PECL ssh2 extension with libssh2. – Chris Kloberdanz Nov 20 '09 at 14:45
0

To use system command you have to:

  1. Configure password-less ssh
  2. Run command like scp filename1 userid@hostname:filename2, check man scp. You can do the same with sftp but with some other options
Elalfer
  • 5,146
  • 18
  • 24
0

You can use Pure-PHP implementation of SSHv2 library.

Here are some examples of how to use this library:

<?php
include 'vendor/autoload.php';
$ssh = new \phpseclib\Net\SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>

And:

<?php
include 'vendor/autoload.php';
$key = new \phpseclib\Crypt\RSA();
//$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
$ssh = new \phpseclib\Net\SSH2('www.domain.tld');
if (!$ssh->login('username', $key)) {
    exit('Login Failed');
}
echo $ssh->read('username@username:~$');
$ssh->write("ls -la\n");
?>