Empty PHP SSH2 stream contents, even with stream_s

2019-08-13 16:57发布

I am working on a tool that reads an iptables configuration from a remote host over SSH2 using the PECL SSH2 extension. I am able to successfully make the connection to the host, authenticate, and execute commands. The trouble I am having is sometimes the stream doesn't contain any data.

 /**
  * Load the current firewall configuration
  * @return bool
  */
 public function loadRules() {
  $stream = ssh2_exec($this->connection,"~/iptsave;");
  stream_set_blocking($stream,true);
  $iptablesSave = stream_get_contents($stream);
  if(empty($iptablesSave)) {
   return false;
   }
  parent::restore($iptablesSave);
  return true;
  }

About 25% of the time, loadRules() returns false, even when connecting to locahost instead of the remote system. I was able to work around the problem by changing the ssh2_exec call to

$stream = ssh2_exec($this->connection,"~/iptsave; sleep .5");

but I am concerned that something is wrong.

标签: php ssh stream
3条回答
手持菜刀,她持情操
2楼-- · 2019-08-13 17:06

phpSecLib may be able to help:

According to this post, it always returns the output, unlike ssh2.so.

查看更多
forever°为你锁心
3楼-- · 2019-08-13 17:28

I've got the same issue here. Somehow you need to set a delay for getting the result of the stream.

The way you've done it is possible, but you could also set a sleep(1) after the stream_set_block($stream, true) function. You could try the usleep() function. Haven't tried it yet

查看更多
一夜七次
4楼-- · 2019-08-13 17:30

May be this will solve the issue:

$stream = ssh2_exec($this->connection,"~/iptsave;");
stream_set_blocking($stream,true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
$iptablesSave = stream_get_contents($stream);
查看更多
登录 后发表回答