ssh2_scp_send()无法在一台服务器上传输整个文件

时间:2011-05-28 08:45:19

标签: php ssh scp

我使用ssh2_scp_send()函数通过ssh方式将文件从服务器发送到另一个服务器。 测试脚本和真正的应用程序在我的Ubuntu工作站,它和远程服务器之间以及我的Windows PC和我办公室的开发CentOS 5.0 Linux服务器之间运行得很好。 在我的客户所在地,ssh2_scp_send()停止,返回false,并且截断发送的文件(6.5MB时为2MB)。发送方和接收方服务器都使用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_sftp / fopen / fwrite / fclose替换ssh2_scp_send(),但它以相同的方式运行,并且速度较慢。

我如何理解为什么转移会挂起?目标服务器上的sshd日志只显示连接和断开连接。

由于

2 个答案:

答案 0 :(得分:0)

在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 :(得分:0)

事实上,我的客户今天早上告诉我,ssh2_sftp / fopen / fwrite / fclose解决方案比ssh2_scp_send()更好。我通过512kb的块读取和fwrite()数据。他的第一个答案是不准确的。 但是我仍然不明白为什么ssh2_scp_send()在几个盒子上运行而不在其他盒子上运行(也许stefgosselin有部分答案)。