Being still in Beta, I guess it will have it quirks. One I found was that if the remote filename has brackets in it, it just wont work.
I should file it as a bug report, but find the process all intimidating really - I am always just a stupid user who does not know what he is on about!
But anyway - the work around of renaming the file before downloading it works fine.
use:
$_new_path = str_replace("(", "", $_path );
$_new_path = str_replace(")", "", $_new_path );
ssh2_sftp_rename( $sftp, $_path, $_new_path );
To tell you the truth I haven't determined if it is the open or close bracket, or both. Someone else can investigate that.
Meanwhile, it would be good to know all the bad filename characters which this function has problems with, no doubt there are more.
ssh2_scp_recv
(PECL ssh2:0.10-0.9)
ssh2_scp_recv — Demande un fichier via SCP
Description
bool ssh2_scp_recv
( resource $session
, string $remote_file
, string $local_file
)
Copie un fichier depuis un serveur distant vers le système de fichiers local.
Liste de paramètres
- session
-
Un identifiant de connexion SSH, obtenu depuis la fonction ssh2_connect().
- remote_file
-
Chemin vers le fichier distant.
- local_file
-
Chemin vers le fichier local.
Valeurs de retour
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemples
Exemple #1 Téléchargement d'un fichier via SCP
<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
ssh2_scp_recv($connection, '/remote/filename', '/local/filename');
?>
ssh2_scp_recv
gordon_e_rouse at yahoo dot com dot au
28-May-2008 12:19
28-May-2008 12:19
miller4980 at msn dot com
23-Apr-2008 08:10
23-Apr-2008 08:10
Problem:
can't pass an array to sftp_scp_rec()
also: for Windows: sftp was not happy when connecting to a Windows dir.
eg: sftp_scp_rec($connection, "remote/directory","local/$directory[$i]");
Solution:
The array was placing whitespace on the end of the variable.
trim(" ","",$directory[$i]);
connecting to Windows dir:
sftp_scp_rec($connection, "linux/directory","\\windows\share[$i]");
This script backs up remote Linux directories to a local Windows directory based on modified dates of files.
The Idea is to get a complete back up of a directory via ftp client etc.
Then when the script runs it will back up newly modified files only.
<?php
//error_reporting(0);
$file ='';
$arr2 ='';
$arr1 ='';
$ldir = '';
$remotedirs[0] = "Domain name or IP address/";
$remotedirs[1] = "Domain name or IP address/";
$remotedirs[2] = "Domain name or IP address/";
$remotedirs[3] = "Domain name or IP address/";
$fh = fopen("c:\dirlist.txt","w");
fwrite($fh, " ");
fclose($fh);
foreach ($remotedirs as $val){
echo $remotedir = "/data/www/$val/";
$localdir = "\\\\192.168.0.234\\C$\\xampp\\htdocs\\$val\\";
backupwebsites($remotedir,$localdir);
}
function backupwebsites($remotedir,$localdir){
$connection = ssh2_connect(Host IP or Domain, 22);
$com ="ls -R -lt $remotedir";
ssh2_auth_password($connection, 'user', 'password');
$stream = ssh2_exec($connection, $com );
stream_set_blocking($stream, true);
$output = stream_get_contents($stream);
$fh = fopen("c:\dirlist.txt","a+");
fwrite($fh, $output);
fclose($fh);
$handle = @fopen('c:\dirlist.txt', "r");
if ($handle) {
while (!feof($handle)) {
$lines[] = fgets($handle, 4096);
}
fclose($handle);
}
foreach ($lines as $val)
{
$yr = date('Y-m-d');
$i++;
$arr1=split("200",$val);
$arr2=explode(" ",$arr1[1]);
if("200".$arr2[0]==$yr)
{
//if("200".$arr2[0]=='2008-04-21'){ //for testing
$remotedir = $remotedir.$arr2[2];
$cpy=$arr2[2];
$file = $localdir;
glue($connection,$remotedir,$localdir,$cpy);
}
}
}
//echo $i;
function glue($connection,$remotedir,$localdir,$cpy){
$ldir[0] = "$localdir";
$ldir[1]="$cpy";
$file = $ldir[0].$ldir[1];
$file = trim($file);
$file;
gop($connection,$remotedir,$file);
}
function gop($connection,$remotedir,$file){
echo $file;
ssh2_scp_recv(
$connection,
$remotedir,
$file);
}
?>
chad dot [the letter d] johnson AT gmail
26-Mar-2008 09:23
26-Mar-2008 09:23
If when trying to use this function you get "Warning: ssh2_scp_send(): Failure creating remote file," then try using
$data = file_get_contents("ssh2.sftp://$sftp/path/to/file");
jcalcote at novell dot com
08-Aug-2006 10:51
08-Aug-2006 10:51
If you scan a remote directory for a list of files by using opendir and readdir on a path obtained from ssh2_sftp(), you'll end up with a list of full file paths containing the ssh2.sftp://$sftp prefix, where $sftp is the sftp resource string returned by ssh2_sftp.
If you later attempt to use ssh2_scp_recv() (even on the same connection!) to copy files locally from the remote path, the copy operation will fail because ssh2_scp_recv() doesn't like the wrapper path prefix. It expects remote file references to be rooted at the base of the remote file system (eg., '/').
Moral: ssh2_scp_recv() likes paths rooted at the file system root on the remote machine, not full network paths. This routine will fail with an obscure message about not being able to copy the files - yet when you go look it works fine. Worse, when you connect and copy them from an scp shell session, it also works fine.
