PHP 尝试将文件上传到服务器时 SSH2 操作失败
PHP SSH2 operations failing when attempting to upload file to server
我目前正在为 PHP(运行 5.5 版)使用 SSH2 built-in 库而苦苦挣扎。如标题所述,我正在尝试将文件上传到 SFTP 服务器,但我不断收到 "stream operation failed" 错误消息。
在尝试调试代码本身后,连接正常,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
请注意,该文件在远程主机上不存在,但据我所知,'w' 模式中的 PHP fopen() 如果文件不存在,则应创建该文件。
我不能使用另一个 PHP 库,因为我们的整个项目都使用内置的 ssh2 库,负责人告诉我不要使用它,因为它在其他任何地方都可以正常工作。
我想如果你使用 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()
。如果它仍然不工作,这可能会提供一些关于正在发生的事情的见解。
答案很简单,我在远程服务器上的路径格式不正确。验证我的设置后,它工作正常。
感谢大家的提示和帮助。
我目前正在为 PHP(运行 5.5 版)使用 SSH2 built-in 库而苦苦挣扎。如标题所述,我正在尝试将文件上传到 SFTP 服务器,但我不断收到 "stream operation failed" 错误消息。
在尝试调试代码本身后,连接正常,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
请注意,该文件在远程主机上不存在,但据我所知,'w' 模式中的 PHP fopen() 如果文件不存在,则应创建该文件。
我不能使用另一个 PHP 库,因为我们的整个项目都使用内置的 ssh2 库,负责人告诉我不要使用它,因为它在其他任何地方都可以正常工作。
我想如果你使用 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()
。如果它仍然不工作,这可能会提供一些关于正在发生的事情的见解。
答案很简单,我在远程服务器上的路径格式不正确。验证我的设置后,它工作正常。
感谢大家的提示和帮助。