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