ssh2_scp_send () не удается передать весь файл на один сервер

#php #ssh #scp

#php #ssh #scp

Вопрос:

я использую функцию 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 на сервере назначения просто показывают подключение и отключение.

Спасибо

Ответ №1:

В 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'); 
  

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

Комментарии:

1. Функция ssh2_scp_send() останавливается с состоянием ошибки, и в моем случае у меня только один Linux-бокс, но я попробую.

Ответ №2:

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