• ベストアンサー
  • 困ってます

Net-Snmpのtraphandleよりshell起動

【環境】RedHat Linux as 3 【現在】  Net-SnmpのTrapHandleを取得し  標準入力から受けた情報をファイルに出力する処理を作成中です。 出力するファイル名を現在時刻にしたいのですが  シェルを実行してもファイルが出力されません。  Perl初心者で手探りで調査していますが煮詰まってしまいました。  すみませんがご教示願います。 【処理内容】  ・snmptrapd.conf  traphandle default /root/bin/trap.sh ・trap.sh  #!/usr/bin/perl  @tim = localtime(time);  $tim[5] += 1900;  $tim[4] += 1;  for($idx=0;$idx<5;$idx++){    $tim[$idx] = sprintf("%02d",$tim[$idx]);  }  while (<STDING>) {    $buf. = $_;  }  open (FILE,">>/tmp/$T[5]$T[4]$T[3].txt");  print FILE $buf;  print FILE "--------\n";  close(FILE);

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数1085
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

その三か所を修正すれば動くと思うのですが、それで動かないというのであれば > open(FILE,">>/tmp/$tim[5]$tim[4]$tim[3].txt"); を、 print "/tmp/$tim[5]$tim[4]$tim[3].txt\n"; open(FILE,">>/tmp/$tim[5]$tim[4]$tim[3].txt") or die $!; のように変更して、期待通りのファイル名になっているか、 エラーが出ないかどうかを確認してください。 あと、  @tim = localtime(time);  $tim[5] += 1900;  $tim[4] += 1;  for($idx=0;$idx<5;$idx++){    $tim[$idx] = sprintf("%02d",$tim[$idx]);  } open のときのためだけにこれをしているのであれば、 openのところを my $filename = sprintf '%4d%02d%02d', $tim[5]+1900, $tim[4]+1, $tim[3]; open FILE, '>>', "/tmp/$filename" or die "could not open '$filename'($!)"; のようにしてしまったほうが良いと思います。 入力の whileも気になるけど、こっちはまあいいや。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご指摘ありがとうございました。 ご指摘通りファイル名が出力されているか、エラーがないか等の 調査を行いファイル名が正しく出力されました。 いろいろ試しながら行っていたので原因ははっきりわかりませんが ソースはほどんど変更しなかった為 ・権限のつけ忘れ ・誤字脱字 の可能性が高いと思います。 お手数お掛けしました。 ありがとうございました。

その他の回答 (1)

  • 回答No.1

これ、作っている途中のものをそのまま貼り付けてますか? どうみても単純な typo がいつくもあるんですけど。 STDING → STDIN $buf. = $_; →  $buf .= $_; ('.' と '=' の間を開けてはダメ) open (FILE,">>/tmp/$T[5]$T[4]$T[3].txt"); T という配列変数はどこからでてきたのでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

ご指摘ありがとうございます。 又、タイプミスが多くご迷惑お掛けしてすみませんでした。 紙に印刷したソースを入力し投稿した為 タイプミスが多くありました。 実際のソースを確認しましたら、 上記の間違いはありませんでした。 下記に修正内容を記述します。 while (<STDIN>) {    $buf.= $_;  } open(FILE,">>/tmp/$tim[5]$tim[4]$tim[3].txt");

関連するQ&A

  • Net-SNMPのPerlモジュールでTrap送信

    現在VineLinuxにNet-SNMP ver5.2.2を インストールした環境で Trapを送信するPerlスクリプトを作成しております。 やりたいことは、マネージャに対し SNMPv2cのTrapをポストすることです。 # 現段階ではSNMPv2であればどのようなTrap # でも構いません。 net-snmp-5.2.2/perl/SNMP/README の内容にならって、下記のようなスクリプトを 作成しました(一部を抜粋)。 ------- スクリプト Start ------- 《 省 略 》 # TrapSessionオブジェクトを生成 $sess = new SNMP::TrapSession(DestHost=>$host, Community=>$comm); # Trap送信 $sess->trap(oid => 'snmpRisingAlarm', uptime => 1234, [[ifIndex, 1, 1], [sysLocation, 0, "here"]]); 《 省 略 》 ------- スクリプト End ------- READMEによると上記フォーマットは v2のものとなるはずですが、 本処理によって送信されるTrapのバージョンは v1となってしまいます。 また、oid部分を変更しても 送信するTrap内容の変化はなく、さらに $sess->trap(); とパラメータ無しに変更しても 同じ内容のTrapが送信されているようです...。 全てにおいて勉強不足状態での質問で 大変恐縮ではありますが、 御存じの方がいらっしゃいましたら、 ご教授お願い致します。

    • ベストアンサー
    • Perl
  • make の$(shell ) コマンドが動かない

    makefileに、以下のようなshell コマンドを記述しているのですが、端末によって(環境変数やmake、perl などのパスは同一)正常に実行されたり、エラーになったりします。 LIST = $(shell cat $(FILE) | perl -ne 'next if (m/^\#/); print $_;' | sed -n "s/\(.*\) \(.*\)/\1_\2/p" ) これはどうしてでしょうか? ----------- やっていることは、$FILE # comment key0 value0 key1 value1 ... というファイルからコメントを除いて、 key0_value0 key1_value1 ... のような文字列をつくって$LISTに渡しています。 ----------- エラーの場合、以下のメッセージが出ます。 perl -ne の部分がダメのようです。 ----------- Bareword found where operator expected at -e line 1, near "/usr/bin" (Missing operator before bin?) syntax error at -e line 1, near "/usr/bin" Execution of -e aborted due to compilation errors. ----------- なお、 LIST = $(shell cat $(FILE) | sed -n "s/\(.*\) \(.*\)/\1_\2/p") なら、端末によらず動作します。 make -version GNU Make 3.80 perl -version This is perl, v5.8.5 built for x86_64-linux-thread-multi 宜しくお願い致します。

  • UDP通信(SNMP)したいが、うまく動かない。

    下記URLの質問の続きのような質問なのですが…。 SNMPで応答を得ようと、下記のようにコードを書いてみたのですが、うまくいきません。 足りないところ、間違っているところ、こうしたらいいんじゃない?等、簡単なことでも結構です。 ご教授いただけたらと思います。 よろしくお願いします。 http://oshiete1.goo.ne.jp/qa4934857.html //ここからコード public class SNMP_UDPReceive2 { public static void main(String[] arg){ System.out.println("hajimata!"); try{ byte buf[] = "Get".getBytes(); //ソケットを作成 DatagramSocket soc = new DatagramSocket(); //パケットを作成(""の中身は例です。) DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.1"),161); //送信 soc.send(packet); //受信処理 byte buf_re[] = new byte[512]; DatagramPacket packet_re = new DatagramPacket(buf,buf.length); soc.receive(packet_re); //受信したデータを取得 String data = new String(packet_re.getData(),0,packet_re.getLength()); System.out.println("\"" + data + "\"を受信しました"); }catch(Exception e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • フリーCGIの改変をお手伝いいただけないでしょうか。(著作者許可済)

    こんばんは。 タイトル通りなのですが、 http://flash.xtaro.com/sozai/tool/fcount/index.htm で提供されている アクセスカウンタに重複カウンタ防止機能を追加したいと思っています。 無断改変禁止とありましたので、事前に著作者様へ 改変内容の旨を伝え許可を頂きました。 Webで調べてやってみたのですが、Perlプログラミングの 経験のない私ではすでにあるソースの内容に新たな機能を 実装するのが困難で、皆様のお力をお借りできないかと書き込みました。 ソースは下記に記載します。 何卒よろしくお願い致します。 [ファイル構成] fcount.dat fcount.cgi fcount_d.swf [fcount.dat] 061617,42,68,2008/5/10 [fcount.cgi] #!/usr/bin/perl # カウントデータのパス(ファイル名) $countdata = './fcount.dat'; # # このツールの著作は有限会社エムエーディー(FLASHフリー素材UFO)に帰属します。 # 無断改造,再配布,再販は厳禁です。 # open(file, "+<$countdata") or die("error:ログデータが開けません"); eval{flock(file, 2);}; $count = <file>; ($totalc,$kyou,$kinou,$tday) = split(/,/, $count); $tim = time; ($sec, $min, $hour, $mday, $mont, $year) = localtime $tim; $year += 1900; ++$mont; $day="$year/$mont/$mday\n"; if ($day ne $tday) { $kinou = $kyou; $kyou = 0; $tday = $day; } ++$totalc; ++$kyou; seek(file, 0, 0); print file "$totalc,$kyou,$kinou,$tday\n"; close(file); # $totalc = sprintf("%06d", $totalc); $kyou = sprintf("%05d", $kyou); $kinou = sprintf("%05d", $kinou); print "Content-Type: text/plain\n\n"; print "&totalc=$totalc&kyou=$kyou&kinou=$kinou&"; exit;

    • ベストアンサー
    • CGI
  • Linux上でtcpdumpの出力をperlで処理したいと考えています

    Linux上でtcpdumpの出力をperlで処理したいと考えています。 下記のようにtcpdumpの標準出力をperlの標準入力で受け取ろうとしても tcpdumpの処理が終わらないためパイプ(|)経由でperlにデータが渡ってきません。 [test.pl] $|=1; foreach(<>){ print "--- $_"; } exit; Linux上のコマンド tcpdump -l | ./test.pl これをteeに置き換えるとtcpdumpの出力はリアルタイムに表示されます。 tcpdump -l | tee a.log 質問:perlでteeを作ることはできますか?

    • ベストアンサー
    • Perl
  • ファイル出力をUTF8NではなくてUTF8で行いたい

    おせわになります。 Shift-JISで記述したPerlで、ファイル出力をしようとしています。 ------------------------------------ #!/usr/local/bin/perl use encoding 'shiftjis'; $hoge="ほげ" open(OUT,">file.txt") binmode OUT; print OUT $hoge; close(OUT); ------------------------------------ 希望はUTF8での出力なのですが、UTF8Nで出力されてしまいます。 どのようにすればいいのかご教授よろしくお願いします。

    • ベストアンサー
    • Perl
  • 連番のファイルを何個も開きたい

    FILE *ab_1,*ab_2,*ab_3,*ab_4,*ab_5,*ab_6,*ab_7,*ab_8,*ab_9,*ab_10,*ab_11,*ab_12,*ab_13,*ab_14,*ab_15,*ab_16; ab_1=fopen("1.txt","w"); ab_2=fopen("2.txt","w"); ab_3=fopen("3.txt","w"); ab_4=fopen("4.txt","w"); ab_5=fopen("5.txt","w"); ・ ・ ・ ab_15=fopen("15.txt","w"); ab_16=fopen("16.txt","w"); という作業をfor文で回せるようにしたいのですがどうしたらいいでしょうか? 自分で作ってみたのは #include<stdio.h> main() { int i; char buf[256],file_name[256]; for(i=0;i<16;i++){ sprintf(buf,"ab_%d",i); sprintf(file_name,"%d.txt",i); FILE *buf; buf = fopen(file_name,"w"); } fprintf(ab_1,"test\n"); } とやってみたのですが、実際にfprintfで出力しようとするとファイルポインタ ab_1 が定義されていません。みたいなエラーが出てしまいます。 sprintfで取った文字をファイルポインタにしようとしてるところがいけないんだとは思うのですが何かいい方法はないでしょうか? 環境はWindowsXP,VC++6です。

  • CGIのライブラリ表示について。

    初心者で申し訳ございません。 今現在、参考書を読みながら時間を表示するCGIを作っています。 フォルダ"time1"に二つのファイル"time1.html"と"time1.pl"があります。 それぞれのファイルは、本を参考に次のように記述しています。 ===time1.html=== <html> <title>time1</title> <body> <h1>時間を表示する</h1> <hr /> <!--#exec cmd="./time1.pl"--> </body> </html> ====== ===time1.pl=== #!/usr/local/bin/perl ($sec, $min, $hour, $day, $mon, $year, $wdy, $yday, $isdst) = localtime(time); @youbi = ("日", "月", "火", "水", "木", "金", "土"); $year += 1900; $mon++; print "$year-$mon-$day, @youbi[$wdy], $hour:$min:$sec\n"; exit; ====== 以上をIE7で表示しますと、 「時間を表示する」は表示されるものの、.plファイル内の時間が表示されません。 何かやり残していることがありますでしょうか。 申し訳ございませんが、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • ファイルの読み込み操作のコーディングについて

    perlのファイル読み込み操作についての質問です #!/usr/local/bin/perl #ファイルの読み込み open(FILE,"<diary.txt"); $data = <FILE>; close(FILE); #サーバー出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>ファイルの読み込み</title> </head> <body> <h5> <p>$data</p> </h5> </body> </html> END 次のように、perlのコードを書いて無料の CGIの使えるレンタルサーバーに 設置したところ、エラーが出てしまいます dairy.txtはこのファイルと同じディレクトリで パスも間違えてないです、いろいろ自分で調べてみたんですが どこが間違えているかわかりません よろしかったらどなたかperlに詳しい方がいらっしゃったら 間違えている箇所を教えていただけないでしょうか?

  • 時間の加算・減算

    以下の様にして現在の時間を取得できることがわかりました。 @d = localtime(); $d = sprintf("%02d/%02d/%02d %02d:%02d:%02d", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]); print "$d\n"; では、 30秒後 5時間後 1日後 10日後 を計算するにはどうすればよいのでしょうか。 また、これだと、”今から”になってしまうのですが、 たとえば 2006/10/10 10:10:10 から 30秒後 5時間後 1日後 10日後 という風に出力していくにはどうするのでしょうか。 今の時刻を表示する例はたくさんあったのですが、 加算に関してはあまりないようです・・・

    • ベストアンサー
    • Perl