Re: Hoping for a working example of SFTP in PHP

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear Eric,

I have tried your latest gist, edited for my environment as shown below. The result was a timeout in the browser, with eventual error message "The connection to the server was reset while the page was loading."

When I add "exit;" after the call to ssh2_connect, the result is instant execution, with no output.

When I move the "exit;" to after the call to ssh2_auth_pubkey_file, the result is instant execution, with no output.

When I move the "exit;" to after the call to ssh2_sftp, the result is instant execution, with no output.

So the timeout happens either in the file_exists call or the copy call.

I don't know how to do any other debugging.

Please help further.

====
<?php declare(strict_types=1);
// Tested on
// PHP 7.4.14 (cli) (built Jan  5 2021 151229) ( ZTS Visual C++ 2017 x64 )
// Windows 10 Pro
// pecl ssh2 v1.2

// Remote server
// Gentoo GNU/Linux Base System release 2.7

$c=GetConfigArr("secret.json");
extract($c);
define("N","<br>");

error_reporting(E_ALL);
ini_set("display_errors", "1");

file_put_contents(__DIR__."\\test.txt", "worked!");

$host = $hostIP;
$port = $securePort;

$connection = ssh2_connect($host, (int)$port);

if(!is_resource($connection)) {
    throw new Exception("Connection failed.");
}

// Without the __DIR__ php will just try to get "id_rsa" and will fail.
// if your keys are elsewhere __DIR__ should be changed to Cpathtoyourfiles
$privateKey = __DIR__."\\A2-nsr.key"; // id_rsa
$publicKey = __DIR__."\\A2-nsr.pub"; // id_rsa.pub
$username = $user;
$passphrase = $passphrase; //"passphrase"; // set this to passphrase if you have one.

$errorHandler = static function(
    int $errorNumber,
    string $errorString,
    string $errorFile = '',
    int $errorLine = 0,
    array $errorContext = []
) use($connection) {
    ssh2_disconnect($connection);
    var_dump($errorContext);
throw new ErrorException($errorString, $errorNumber, 1, $errorFile, $errorLine);
};

set_error_handler($errorHandler);

if(false === ssh2_auth_pubkey_file($connection, $username, $publicKey, $privateKey, $passphrase)) {
    throw new Exception("Authentication failed.");
}

$sftp = ssh2_sftp($connection);
$remoteFile = "/home/$user/$remoteDir/test.txt";

$streamUrl = sprintf("ssh2.sftp//%d%s", (int)$sftp, $remoteFile);
$localFile = __DIR__ . "\\test.txt";

if(!file_exists($streamUrl)) {
    if(true === copy($localFile, $streamUrl)) {
print sprintf("Successfully copied local file '%s' to remote file '%s'", $localFile, $streamUrl) . PHP_EOL;
    } else {
print sprintf("Failed to copy local file '%s' to remote file '%s'", $localFile, $streamUrl) . PHP_EOL;
    }
} else {
    print sprintf("File '%s' exists.", $streamUrl) . PHP_EOL;
}

unset($sftp); // If you don't unset $sftp ssh2_disconnect will throw a segfault.
ssh2_disconnect($connection);

function GetConfigArr($file)
	{
	global $pagesDir;
	$configStr=@file_get_contents($file);
	if ($configStr===false)
exit("*** HMAC: Config file '$file' is missing from $pagesDir; please read ".
			"file HMAC\Installation.txt for the steps to set up your HMAC website.");
	return json_decode($configStr,true);
	} // GetConfigArr
?>
====

David



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux