Назад | Перейти на главную страницу

snmptrapd traphandle в php скрипт

Мне нужно получить snmptraps в php-скрипте, поэтому я сделал следующее:

snmptrapd.conf

traphandle 1.3.6.1.4.1.3.1.1 /usr/home/user/trap/l.php

l.php

#!/usr/local/bin/php
<?php
$flow = fopen("php://stderr","r");
while(!feof($flow)){
    file_put_contents("out",fread($flow,1024)."\n", FILE_APPEND);
}
?>

затем я запускаю snmptrapd вот так:

snmptrapd -Le -f

и сгенерировал такие ловушки:

snmptrap -v 1 -c public localhost '' localhost 6 1 ''

snmptrapd дает мне такой вывод

2012-01-16 14:38:49 127.0.0.1(via UDP: [127.0.0.1]:11478->[0.0.0.0]:0) TRAP, SNMP v1, community public
        SNMPv2-SMI::enterprises.3.1.1 Enterprise Specific Trap (1) Uptime: 70 days, 1:03:57.00

так что вроде работает ... но проблема в том, что l.php не выполняется, или в stderr ничего нет - я не могу понять.

пожалуйста, в чем моя ошибка?

php://stderr не является потоком, из которого можно читать. Это труба к STDERR для самого процесса PHP, который доступен только для записи.

Вам необходимо получить доступ к данным через STDIN. Вместо того, чтобы использовать php:// оболочка для доступа к потокам STDIO, которая, как известно, содержит ошибки (см. руководство) следует использовать специальные константы STDOUT, STDERR и STDIN. Так, например, я мог бы написать ваш PHP-скрипт следующим образом:

#!/usr/local/bin/php
<?php

  // The file we will be writing to. It's best to specify a full path, to avoid
  // any confusion over the current working directory
  $outFile = '/var/myuser/snmp.out';

  // First, we'll open our outfile...
  if (!$ofp = fopen($outFile, 'a')) exit("Oh No! I couldn't open my out file!");

  // ...and write the current timestamp to it, so we are certain the script was
  // invoked. You can remove this if you want, once you are sure it is working
  fwrite($ofp, "Process started at ".date('Y-m-d H:i:s')."\n");

  // Next we'll write all the trap data to the file
  // We could use stream_copy_to_stream() for this, but I don't know if it is
  // available on your server so I won't do it here
  fwrite($ofp,"Data:\n");
  while (!feof(STDIN)) {
    fwrite($ofp, fread(STDIN, 1024)."\n");
  }
  fwrite($ofp,"End Data\n");

  // We don't actually need a closing PHP tag and in many cases it is better
  // to omit it, to avoid unexpected whitespace being output.