我有一个在 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]
- 添加用于编译PECL模块的PHP5-DEV
- 重新安装SSH2 PECL模块。
- 重新启动apache并运行良好