IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

SSH2 Fichiers transferés en SFTP altérés


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut SSH2 Fichiers transferés en SFTP altérés
    Bonjour à tou(te)s,

    J'utilise la classe sFtp pour faire des transferts FTP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		require_once $urlRepApp."class/sftp.class.php";
    		$sftp = new SFTPConnection($serveur);
    		//$ret .= "<tr><td align='center'>Connexion FTP ouverte.</td></tr>";
    		$sftp->login($login, $passe);
    		foreach ($tabFicGen2 as $file) {
    			if (file_exists($file)) {
    				$sftp->uploadFile($file, $ChemRep.basename($file)); // Receive Send
    			} 
    		} // */
    La classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    <?php
     
    class SFTPConnection {
    	private $connection;
    	private $sftp;
     
    	public function __construct($host, $port=22) {
    		$this->connection = @ssh2_connect($host, $port);
    		if (! $this->connection) {
    			throw new Exception("Could not connect to $host on port $port.");
    		} //else echo "Connexion OK.<br />";
    	}
     
    	public function login($username, $password) {
    		if (! @ssh2_auth_password($this->connection, $username, $password))
    			throw new Exception("Could not authenticate with username $username and password $password.");
    		$this->sftp = @ssh2_sftp($this->connection);
    		if (! $this->sftp) {
    			throw new Exception("Could not initialize SFTP subsystem.");
    		} //else echo "Authentification OK.<br />";
    	}
     
    	public function uploadFile($local_file, $remote_file) {
    		$sftp = $this->sftp;
    		$stream = @fopen("ssh2.sftp://$sftp$remote_file", 'wb');
    		if (! $stream) {
    			throw new Exception("Could not open file: $remote_file");
    		} //else echo "Ouverture fichier OK.<br />";
    		$data_to_send = @file_get_contents($local_file);
    		if ($data_to_send === false)
    			throw new Exception("Could not open local file: $local_file.");
    		if (@fwrite($stream, $data_to_send) === false)
    			throw new Exception("Could not send data from file: $local_file.");
    		@fclose($stream); // */
    	}
     
    	function scanFilesystem($remote_file) {
    		$sftp = $this->sftp;
    		$dir = "ssh2.sftp://$sftp$remote_file";
    		$tempArray = array();
    		$handle = opendir($dir);
    		// List all the files
    		while (false !== ($file = readdir($handle))) {
    			if (substr("$file", 0, 1) != ".") {
    				if(is_dir($file)){
    					// $tempArray[$file] = $this->scanFilesystem("$dir/$file");
    				} else {
    					$tempArray[]=$file;
    				}
    			}
    		}
    		closedir($handle);
    		return $tempArray;
    	}    
     
        public function receiveFile($remote_file, $local_file) {
    		$sftp = $this->sftp;
    		$stream = @fopen("ssh2.sftp://$sftp$remote_file", 'r');
    		if (! $stream)
    			throw new Exception("Could not open file: $remote_file");
    		$contents = fread($stream, filesize("ssh2.sftp://$sftp$remote_file"));            
    		file_put_contents ($local_file, $contents);
    		@fclose($stream);
        }
     
    	public function deleteFile($remote_file){
    		$sftp = $this->sftp;
    		unlink("ssh2.sftp://$sftp$remote_file");
    	} 
    }
     
    /*echo "Tentative de connexion SCP.<br /><br />";
    function my_ssh_disconnect($reason, $message, $language) {
    	printf("Server disconnected with reason code [%d] and message: %s\n", $reason, $message);
    }
    //Notification à l'utilisateur si le serveur termine la connexion
    $methods = array('kex'=>'diffie-hellman-group1-sha1',
    	'client_to_server'=>array('crypt'=>'3des-cbc', 'comp'=>'none'),
    		'server_to_client'=>array('crypt'=>'aes256-cbc,aes192-cbc,aes128-cbc', 'comp'=>'none'));
    $callbacks = array('disconnect'=>'my_ssh_disconnect');
    echo "Lancement de la connexion.<br /><br />";
    $conn_id = ssh2_connect($serveur, 22); // , $methods, $callbacks
    echo "Connexion lancée ($conn_id).<br /><br />";
    $fingerprint = ssh2_fingerprint($conn_id, SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
    echo "Empreinte retournée ($fingerprint).<br /><br />";
    if ($conn_id) {
    	echo "Connexion ouverte ($conn_id).<br /><br />";
    	if (ssh2_auth_password($conn_id, $login, $passe)) { // Identification avec un nom d'utilisateur et un mot de passe
    		echo "Utilisateur connecté.<br /><br />";
    		ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
    		if (ssh2_scp_send($conn_id, $file, "/Receive/".$file, 0644)) { // Tente de charger le fichier $file
    			echo "Chargement avec succès du fichier $file\n";
    		} else 
    			echo "Il y a eu un problème lors du chargement du fichier $file<br /><br />";
    	} else
    		echo "Connexion impossible en tant que '".$login."'<br /><br />";
    } else 
    	echo "Impossible de se connecter au serveur.<br /><br />"; // */
     
    /*echo "Tentative de connexion FTP.<br /><br />";
    $conn_id = ftp_connect($serveur, 22); // Mise en place d'une connexion basique "sftp://83.167.36.240"
    echo "Connexion lancée ($conn_id).<br /><br />";
    if ($conn_id) {
    	echo "Connexion ouverte ($conn_id).<br /><br />";
    	if (ftp_login($conn_id, $login, $passe)) { // Identification avec un nom d'utilisateur et un mot de passe
    		echo "Utilisateur connecté.<br /><br />";
    		if (ftp_fput($conn_id, $file, $fp, FTP_ASCII)) { // Tente de charger le fichier $file
    			echo "Chargement avec succès du fichier $file\n";
    		} else 
    			echo "Il y a eu un problème lors du chargement du fichier $file<br /><br />";
    	} else
    		echo "Connexion impossible en tant que '".$login."'<br /><br />";
    } else 
    	echo "Impossible de se connecter au serveur.<br /><br />"; // */
     
    ?>
    Les fichiers sont biens copiés sur le serveur, seulement, il sont altérés.
    Ils font une 20 aine d'octets de moins que les originaux: Les Zip sont corrompus et les images JPG sont à 90% noires (il n'y a que le bandeau haut de l'image qui est bon)

    J'ai fait des transferts via WinScp (un logiciel avec une interface graphique) et tout se passe très bien.

    Il faut dire que mon serveur est un SUZE et le serveur distant est un Windows 2000.
    C'est pourquoi j'ai mis l'option "b" à fOpen().

    Avez vous d'autres techniques de transfert (il faut que ce soit du SFTP) ou des idées ?

    Merci d'avance.

    David

  2. #2
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Je viens de faire des tests poussés.

    Je transfert un fichier texte de mon linux vers un Windows 2000.

    En fait, malgré qu'il soit forcé en binaire ("b"), les retours chariot passent de CrLf à Cr.
    Ce n'est pas normal, et c'est d'autant plus étrange que ça devrait être le contraire.

    Avez vous une idée du pourquoi le binaire ne fonctionne pas ?

Discussions similaires

  1. [XL-2007] Upload fichier sur serveur SFTP VBA
    Par meumeu73.1 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/11/2013, 08h58
  2. Upload fichier sur serveur SFTP VBA
    Par mimi7690 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/12/2012, 15h31
  3. Réponses: 5
    Dernier message: 10/01/2011, 17h33
  4. Envoi/Réception d'un fichier texte sur SFTP
    Par Totik dans le forum Access
    Réponses: 1
    Dernier message: 27/10/2009, 04h06
  5. Télécharger fichiers distant par sftp sous XP ?
    Par eric0279 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 07/06/2008, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo