php sftp seg fault - PullRequest
       6

php sftp seg fault

2 голосов
/ 14 сентября 2011

Что мне нужно сделать, если следующий код даст мне ошибку сегмента?

    $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 ]

3 голосов
/ 29 января 2017

Я отвечаю на этот старый вопрос из-за высокого рейтинга в поиске Google.Я столкнулся с той же ошибкой сегментации, и реального решения здесь не было.

Оказывается, что начиная с PHP 5.6, поведение функции ssh2_sftp изменилось и теперь возвращает ресурс, который не позволяетбыть объединенным в строку для формирования путей к файловой системе.

Итак, когда вы получите возврат ssh2_sftp, вам сначала нужно пропустить его через intval, чтобы построить путь к удаленному файлу:1008 *

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

Добро пожаловать.

3 голосов
/ 21 октября 2011

У меня была такая же проблема, и я решил ее, обновив пакет ssh2 pecl до версии 0.11.3

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

У меня сработало после некоторых проблем.

Привет

2 голосов
/ 14 сентября 2011

Ошибка seg (mentation) является внутренней ошибкой в ​​php или расширении SSH / SFTP.Вы должны сообщить об ошибке в отношении указанного расширения.

Не забудьте включить короткий воспроизводимый пример .Поскольку это может быть воспроизведено только с вашей конкретной комбинацией клиента и сервера ssh, вы должны сначала воспроизвести ошибку на совершенно новой виртуальной машине и записать каждый ваш шаг, например:

  1. Установите Ubuntu 11.04amd64 в виртуальной машине
  2. Установить ssh с $ sudo apt-get install ssh
  3. Сконфигурировать ssh с ...
  4. Установить php с $ sudo apt-get install php5-cli
  5. Скопировать скрипт [ссылка на http://pastebin.com/ здесь] на виртуальную машину
  6. Введите php ssh-segfault.php и получите ошибку сегмента.
1 голос
/ 21 февраля 2017

Не применимо к ситуации с OP, но если вам не удастся явно вызвать closedir для дескриптора, созданного opendir, вы также получите ошибку segfault во время внутренней очистки PHP в конце скрипта.

0 голосов
/ 06 октября 2017

Один из приведенных выше ответов предполагает, что вам нужно привести ресурс к типу int intval($sftp), чтобы избежать ошибки segfault.

Хотя я полагаю, что это имело место, теперь это, кажется, инвертировано, по крайней мере на 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: // ИД ресурса # 2675 / var / file.text

0 голосов
/ 10 марта 2015

У меня была похожая проблема, хотя и с некоторыми дополнительными факторами.Я начну с решения: используйте абсолютные пути, а не относительные.И избегайте ~.

Что касается моих выводов.Возьмите этот сценарий:

#!/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 вызове.Немного странно встречаться после двух идентичных вызовов - но достаточно легко для анализа.

Но оставшаяся часть кода моего приложения может привести к segfault.В конце концов я сузил его до того, что он включает в себя файл, который определяет функцию, которая использует константу __FILE__, изменяет ошибку, превращая ее в ошибку сегментации.

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

Надеюсь, это поможет кому-нибудь еще в какой-то момент ...

...