php sftp seg fault

时间:2011-09-14 09:35:29

标签: php sftp readdir

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

    $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);

连接工作正常。和segfault是我只使用readdir函数。

6 个答案:

答案 0 :(得分:3)

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

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

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

此致

答案 1 :(得分:3)

由于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);

欢迎你。

答案 2 :(得分:2)

seg(mentation)错误是php或SSH / SFTP扩展中的内部错误。你应该file a bug反对有问题的扩展名。

不要忘记包含short, reproducible example。由于这可能只能与您的ssh客户端和服务器的特定组合重现,您应该首先在全新的VM中重现该错误并记录您所做的每一步,如下所示:

  1. 在VM中安装Ubuntu 11.04 amd64
  2. 使用$ sudo apt-get install ssh
  3. 安装ssh
  4. 配置ssh with ...
  5. 使用$ sudo apt-get install php5-cli
  6. 安装php
  7. 将脚本[链接到http://pastebin.com/此处]复制到VM
  8. 输入php ssh-segfault.php并收到段错误。

答案 3 :(得分:1)

不适用于OP的情况,但是如果你没有在opendir创建的句柄上明确地调用closedir,那么在脚本结束时PHP内部清理期间你也会得到一个段错误。

答案 4 :(得分:0)

我遇到了类似的问题,但有一些其他因素。我将从解决方案开始:使用绝对路径,而不是相对路径。并避免使用~

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

#!/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__);
}

我希望这在某些方面可以帮助其他人......

答案 5 :(得分:0)

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

虽然我相信这曾经是这种情况,但现在似乎已经倒转了,至少在php 7.1.9上并且转换为int现在导致了segfault,至少是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