#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 () выполняется на нескольких блоках, а не на других (возможно, у стефгосселина есть часть ответа).