Мне нужно получить 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.