我目前正在努力使用PHP的SSH2内置库(运行版本5.5)。我正在尝试将文件上传到SFTP服务器,因为标题状态但是我不断收到“流操作失败”错误消息。
尝试调试代码本身后,连接正常工作,sftp资源被正确分配了ID,但是当调用fopen将文件直接写入远程服务器时,它会失败。
// open Live environment if we are not in dev
$connection = ssh2_connect($this->_settings['source_host'], 22);
$authSuccess = ssh2_auth_password($connection, $this- >_settings['source_user'], $this->_settings['source_password']);
$sftp = ssh2_sftp($connection);
最后是fopen()调用:
if($operation == 'export') {
$handle = fopen("ssh2.sftp://".$sftp."/remotecopy/IN/".$filename, $mode);
}
我在自己的代码中添加了调试消息,以验证_settings数组中的数据是否也正确使用了,但是我无法解释流错误。
Message: fopen(): Unable to open ssh2.sftp://Resource id #173/PATH GOES HERE/filename.xxx on remote host
Message: fopen(ssh2.sftp://Resource id #173/PATH GOES HERE/filename.xxx): failed to open stream: operation failed
注意,远程主机上不存在该文件,但根据我的知识,PHP中的'w'模式fopen()应该创建该文件(如果该文件不存在。)
我无法使用其他PHP库,因为我们整个项目都使用内置的ssh2库,并且有人告诉我不要使用它,因为它在其他任何地方都能正常工作。
答案 0 :(得分:2)
我认为如果你使用phpseclib, a pure PHP SFTP implementation,你会有更轻松的时间。例如
<?php
include('Net/SFTP.php');
$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
exit('Login Failed');
}
// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
?>
关于phpseclib的一个好处是它的日志记录,所以如果它不起作用,你可以在包含Net / SFTP.php后执行define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
然后执行echo $sftp->getLog()
它失败的地方。这可能会提供一些有关如果它仍然无法正常工作的信息。
答案 1 :(得分:1)
答案很简单,我在远程服务器上格式化了错误的路径。验证我的设置后,它工作得很好。
谢谢大家的提示和帮助。