使用SFTP和SSH2对FOPEN的分割故障



我有一个在 aws 上运行的PHP系统,并且使用 SHH2 上传XLSX文件的类,该类将XLSX上传到外部服务器上sftp 。该代码工作正常,直到AWS软件包的最后升级 OpenSSH-CLIENTS-6.6.6.1P1-31.62 openssh-Server-6.6.6.6.6.6.1p1-31.62 strong> segfault 在 Fopen 中。Fopen在外部服务器上创建一个文件。这里的代码:

$stream = @fopen("ssh2.sftp://$this->sftp$remote_file", 'w');

然后,我使用$ stream编写内容,但是代码在fopen bacause a segfault上停止。我没有发现这个问题,我认为问题是OPNessh的新升级,因为PHP代码没有更改。有什么想法吗?

在stackoverflow上找到答案:https://stackoverflow.com/a/40972584/2520795

似乎自此PHP更新以来,您必须用intval()包围主机部分(ssh2_sftp()的结果):

$handle = opendir("ssh2.sftp://".intval($sftp)."/path/to/directory");

在我的情况下,有一个fopen而不是opendir,但解决方案是相同的。

如果您与ssh2_disconnect()关闭连接,即使使用intval($sftp)解决方案也可能会遇到"分割故障"问题。正确的解决方案是在通过unset($sftp)$sftp = null关闭SSH2连接之前关闭SFTP连接。这是我读取远程文件的完全工作示例:

if (!$ssh2_connection = ssh2_connect($host, $port)) {
    die("Failed to connectn");
}
if (!ssh2_auth_password($ssh2_connection, $username, $password)) {
    die("Failed to loginn");
}
if (!$sftp_connection = ssh2_sftp($ssh2_connection)) {
    die("Failed to open SFTP sessionn");
}
if (!$fh = fopen("ssh2.sftp://".intval($sftp_connection).$path, 'r')) {
    die("Failed to open filen");
}
while (($s = fgets($fh)) !== false) {
    echo $s;
}
fclose($fh);
unset($sftp_connection);
if (!ssh2_disconnect($ssh2_connection)) {
    die("Failed to disconnectn");
}

P.S。另外,您可能会看到类似:

而不是"分割故障"

php:channel.c:2570:_libssh2_channel_free:断言"会话"失败。

中止

我的解决方案解决了。

在我们的情况下,intval()没有求解分段故障。但是,更改呼叫格式确实有效:

fopen("ssh2.sftp://{$username}:{$password}@{$host}:{$port}/{$absolutePath}/{$filename}", 'w');

我有相同的错误,但是我发现了这个php错误(请参阅ovoelker by wavecon dot de的帖子:[2016-12-15 09:47 UTC]

  1. 添加用于编译PECL模块的PHP5-DEV
  2. 重新安装SSH2 PECL模块。
  3. 重新启动apache并运行良好

相关内容

  • 没有找到相关文章

最新更新