我使用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日志只显示连接和断开连接。
由于
答案 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有部分答案)。