因此,我会执行一个简单的步骤,首先通过ssh2_exec(在成功验证后)执行命令,然后将答案读取到变量中。我的代码如下(没有身份验证)
try {
$stdout_stream = ssh2_exec($this->connection, $_cmd);
$stderr_stream = ssh2_fetch_stream($stdout_stream, \SSH2_STREAM_STDERR);
} catch (Exception $e) {
$std_output = $e->getMessage();
return false;
}
$output = "";
while (!feof($stdout_stream)) {
$output .= fgets($stdout_stream, 4096);
}
while (!feof($stderr_stream)) {
$output .= fgets($stderr_stream, 4096);
}
fclose($stdout_stream);
fclose($stderr_stream);
return $output;
例如,我尝试执行这样的命令:
sudo service httpd stop && sudo service httpd start
当命令正确执行时,一切正常,响应为:
关闭 httpd: [ OK ]启动 httpd: [ OK ]
但是当我尝试在没有使用 sudo 的情况下执行此类命令时:
service httpd stop && service httpd start
我知道服务器可能会提示类似于“命令未找到”的错误,但是我却收不到这个错误,这个脚本一直在执行。
我尝试以以下方式重写我的代码(或者类似于以下的方式)
$dataString = fgets($stdout_stream);
if($dataString == "\n" || $dataString == "\r\n" || $dataString == "") {
//var_dump("Empty line found.");
}
if($dataString === false && !feof($stdout_stream)) {
//var_dump("not string");
} elseif($dataString === false && feof($stdout_stream)) {
//var_dump("We are at the end of the file.\n");
break;
} else {
//else all is good, process line read in
$output .= $dataString;
}
}
但是结果是相同的。
所以问题在于我们无法预先确定是$stdout_stream
还是$stderr_stream
引起了无限循环。
我正在使用PHP 5.3。
fgets($stdout_stream)
也会返回false,因此当我知道命令不会执行良好时,我不能依赖它。Auth_User拥有重启httpd服务的权限。 - Alexandr Suleymanov