2

如果下一个代码给我段错误,我需要做什么?

    $handle = opendir("ssh2.sftp://$sftp".'/usr/bin/');
    $file = readdir($handle);
    closedir($handle);

$sftp 在哪里

    $this->_connection = ssh2_connect($this->_server, 22);
    if($this->_authType==ExportInterface::CONN_AUTH_KEY) {
        ssh2_auth_pubkey_file($this->_connection,$this->_user,$this->_key,$this->_privateKey);
    } else {
        ssh2_auth_password($this->_connection,$this->_user,$this->_password);
    }
    $sftp = ssh2_sftp($this->_connection);

连接工作良好。段错误是只有我使用 readdir 函数时。

4

6 回答 6

4

由于在 Google 搜索中的高排名,我正在回答这个老问题。我遇到了同样的分段错误,真正的解决方案不在这里。

事实证明,自 PHP 5.6 以来,函数的行为发生了ssh2_sftp变化,现在返回的资源不允许以字符串形式连接以形成文件系统路径。

所以,一旦你返回了ssh2_sftp,你必须首先通过它intval来构建远程文件路径:

$sftp = ssh2_sftp($this->_connection);
$handle = opendir('ssh2.sftp://' . intval($sftp) . '/usr/bin/');
$file = readdir($handle);
closedir($handle);

不客气。

于 2017-01-29T17:32:11.150 回答
3

我有同样的问题,我解决了它升级 ssh2 pecl 包到版本 0.11.3

sudo pecl install ssh2 channel://pecl.php.net/ssh2-0.11.3

在遇到一些问题后它对我有用。

问候

于 2011-10-21T09:56:34.700 回答
2

seg(mentation) 错误是 php 或 SSH/SFTP 扩展中的内部错误。您应该针对相关扩展提交错误

不要忘记包含一个简短的、可重复的示例。由于这可能只能通过您的 ssh 客户端和服务器的特定组合来重现,因此您应该首先在全新的 VM 中重现该错误并记录您所做的每一步,如下所示:

  1. 在虚拟机中安装 Ubuntu 11.04 amd64
  2. 安装 ssh$ sudo apt-get install ssh
  3. 使用...配置 ssh
  4. 安装php$ sudo apt-get install php5-cli
  5. 将脚本 [link to http://pastebin.com/ here] 复制到 VM
  6. 键入php ssh-segfault.php并接收段错误。
于 2011-09-14T09:42:39.167 回答
2

不适用于 OP 的情况,但如果您未能在 opendir 创建的句柄上显式调用 closedir,您还将在脚本结束时的 PHP 内部清理期间出现段错误。

于 2017-02-21T01:43:45.127 回答
1

我有一个类似的问题,虽然有一些额外的因素。我将从解决方案开始:使用绝对路径,而不是相对路径。并避免~.

至于我的发现。拿这个脚本:

#!/usr/bin/php
<?php

$ssh = ssh2_connect('hostname.example.com');
$res = ssh2_auth_pubkey_file($ssh, 'user', '~/.ssh/various-keys/special-key_2015.pub', '~/.ssh/various-keys/special-key_2015');
unset($res); unset($ssh);

$ssh = ssh2_connect('hostname.example.com');
$res = ssh2_auth_pubkey_file($ssh, 'user', '~/.ssh/various-keys/special-key_2015.pub', '~/.ssh/various-keys/special-key_2015');

ssh2_auth_pubkey_file在第二次调用中导致身份验证错误。在两次相同的调用之后遇到有点奇怪 - 但很容易分析。

但是将我的应用程序代码的其余部分放在它周围会导致段错误。最终,我将其范围缩小到包括一个文件,该文件定义了一个函数,该函数使用__FILE__常量更改错误以变成分段错误。

甚至像这样简单的文件:

<?php
function nothing() { 
    error_log(__FILE__);
}

我希望这可以在某个时候对其他人有所帮助...

于 2015-03-10T11:15:35.267 回答
0

上面的答案之一表明您需要将资源转换为 intintval($sftp)以避免段错误。

虽然我相信这曾经是这种情况,但现在似乎已经反转了,至少在 php 7.1.9 上并且现在转换为 int 会导致段错误,至少在以下情况下file_put_contents

$connection = ssh2_connect($host, $port);
$sftp = ssh2_sftp($connection);
$remoteFile = 'ssh2.sftp://' . intval($sftp) . '/var/file.text'
echo $remoteFile
file_put_contents($remoteFile, 'Content');  

ssh2.sftp://2675/var/file.text

分段故障

没有演员表它可以工作:

$connection = ssh2_connect($host, $port);
$sftp = ssh2_sftp($connection);
$remoteFile = 'ssh2.sftp://' . $sftp . '/var/file.text'
echo $remoteFile
file_put_contents($remoteFile, 'Content');  

ssh2.sftp://资源id #2675/var/file.text

于 2017-10-06T09:56:01.410 回答