ssh2_scp_send () не может передать весь файл на один сервер - PullRequest
1 голос
/ 28 мая 2011

Я использую функцию ssh2_scp_send () для отправки файлов с сервера на другой через ssh.Тестовый скрипт и реальное приложение прекрасно работают на моей рабочей станции Ubuntu, между ней и удаленным сервером, а также между моим ПК с Windows и сервером разработки CentOS 5.0 Linux в моем офисе.В моем клиентском месте ssh2_scp_send () останавливается, возвращает false, и отправленный файл усекается (2 МБ для 6,5 МБ).Отправитель и сервер-получатель используют CentOS 5.5 и являются виртуальными серверами на гипервизоре VmWare Vsphere.Существует виртуальная локальная сеть между ними.Меньшие файлы не усекаются.На каждом сервере достаточно места на диске.

Вот тестовый скрипт:

<?php

$source = '/sourcefile.dat';
$dest = '/destfile.dat';

$serveur = 'sshserver';
$login = 'login';
$sPub = 'public_key';
$sPriv = 'private_key';
$passphrase = 'pass';

$aSSHMethods = array(
        'kex' => 'diffie-hellman-group1-sha1',
        'client_to_server' => array(
                'crypt' => '3des-cbc,aes256-cbc,aes192-cbc,aes128-cbc',
                'comp' => 'none'),
        'server_to_client' => array(
                'crypt' => '3des-cbc,aes256-cbc,aes192-cbc,aes128-cbc',
                'comp' => 'none'),
        );

$rSSH = ssh2_connect($serveur, 22, $aSSHMethods);   
ssh2_auth_pubkey_file($rSSH, $login, $sPub, $sPriv, $passphrase);
ssh2_scp_send($rSSH, $source, $dest);

Я попытался заменить ssh2_scp_send () на ssh2_sftp / fopen / fwrite / fclose, но этозапустить так же, и медленнее.

Как я могу понять, почему трансфер зависает?Журналы sshd на конечном сервере просто показывают соединение и отключение.

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 мая 2011

На самом деле мой клиент сказал мне сегодня утром, что решение ssh2_sftp / fopen / fwrite / fclose работает лучше, чем ssh2_scp_send ().Я читаю и fwrite () данных блоком 512kb.Его первый ответ был неточным.Но я до сих пор не понимаю, почему ssh2_scp_send () запускается на нескольких боксах, а не на других (возможно, у stefgosselin есть часть ответа).

0 голосов
/ 28 мая 2011

В Windows ssh_scp, кажется, держит соединение открытым и зависает там с файлом в буфере.

Попробуйте сделать явный вызов "exit", чтобы закрыть сеанс (сброс содержимого файла на диск):

<?php 
  $objConnection = ssh2_connect($strHost, $strPort, $methods, $callbacks); 
  ssh2_auth_password($objConnection, $strUser, $strPassword); 
  ssh2_scp_send($objConnection , $strSource, $strDest); 

  // Add this to flush buffers/close session 
  ssh2_exec($objConnection, 'exit'); 

Не уверен, что это решит вашу проблему, но, возможно, стоит попробовать.

...