如果下一个代码给我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函数。
答案 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中重现该错误并记录您所做的每一步,如下所示:
$ sudo apt-get install ssh
$ sudo apt-get install php5-cli
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