Net-Snmpのtraphandleよりshell起動

このQ&Aのポイント
  • Net-SnmpのTrapHandleを取得し、標準入力から受けた情報をファイルに出力する処理を作成中です。
  • ファイル名を現在時刻にしたいのですが、シェルを実行してもファイルが出力されません。
  • Perl初心者で手探りで調査していますが、煮詰まってしまいました。ご教示願います。
回答を見る
  • ベストアンサー

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);

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答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も気になるけど、こっちはまあいいや。

-cinq-
質問者

お礼

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

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

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

-cinq-
質問者

補足

ご指摘ありがとうございます。 又、タイプミスが多くご迷惑お掛けしてすみませんでした。 紙に印刷したソースを入力し投稿した為 タイプミスが多くありました。 実際のソースを確認しましたら、 上記の間違いはありませんでした。 下記に修正内容を記述します。 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
  • snmpとルータのログについて

    はじめまして、新米ネットワーク管理者のmagurogyosen0000です。 現在、ciscoの2600シリーズのルータを使用しています。 snmpで監視しているのですが、 ルーターのローカルに出力されるログはSNMPサーバーに出力されるので ルータ上で上書きされたログもSNMPサーバーには残っている。 と聞いたのですが、本当でしょうか? snmp監視にはJP1/NNMというネットワーク監視ソフトを使っているのですが、 どうやって、ルータのログをみれば良いのかまったく分かりません。 snmpトラップでMIBから引き出してくれば良いのでしょうか? でも、その時は何のMIBを使えばいいのか・・・。 それとも直接、サーバにログファイル等がたまってるんでしょうか? どなたか、情報をお持ちでしたら、教えていただけますでしょうか。 よろしくお願いいたします。

  • Linux シェルの trap について

    お世話になります。 シェルについて、どなたかご教授頂けますと幸いで御座います。 以下、★処理を実施していますが、シェル.sh を実行中に Ctrl+\ で終了(シグナル)しても トラップ処理が実行されません。"| tee -a ファイル名" を削除し、シェル.sh のみ実行すると、 トラップ処理が実行されます。何か、良いアイデアは御座いますか?? ******************************************************* #!/bin/bash #------------------------------------------------------------------------------ # Trap #------------------------------------------------------------------------------ trap 'echo "trapped."; トラップ処理 >> /dev/null 2>&1;exit 1' 1 3 15 trap '' 2 umask 022 : <中略> : #------------------------------------------------------------------------------ # main #------------------------------------------------------------------------------ シェル.sh | tee -a ファイル名 ★ #シェル.sh *******************************************************

  • perlで変数をunix時間から時刻表示に変換したいがうまくできない

    変数に入ったUNIX時間を下記のようなperlコマンドで普通の時刻表示に変換したいのですが、 変数がうまく展開できません。 (↓のままだと、1970年1月1日になります) 'や"や\を組み合わせたらどうにかなるかと思うのですが、どうすればいいでしょうか? #! /bin/sh UX_TIME=113423423 perl -e 'print localtime($UX_TIME) . "\n"' exit 0 以上、よろしくお願いします。

  • レンタルサーバーでperlのcgiファイルを実行する手順を教えて下さい

    レンタルサーバーでperlのcgiファイルを実行する手順を教えて下さい。 レンタルサーバー会社からは、「cgi-bin」フォルダにcgiファイルを配置(アップロード)すれば ブラウザで見れると説明を受けました。 用意したcgiファイルは以下の内容です。 _____________________________ #! c:/perl64/bin/perl # CGIヘッダーの出力 print "Content-type: text/html\n\n"; #さいころを振る。 $n = int(rand 6) + 1; #HTMLの出力 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0.1//EN\">\n"; print "<html>\n"; print "<head><title>Perlでさいころ</title></html>\n"; print "<body>"; print "<p>さいころの目は<big>$n</big>です。</p>\n"; #御言葉を出力 if($n == 4){ print "<p>ふ、不吉な・・・。4が出ました。</p>\n"; } print "<body></html>"; __________________________________________ 一行目が原因でしょうか。ローカルで作成した、cgiファイルをレンタルサーバーに配置(アップロード)し ブラウザから見たいと考えております。 ご存知の方、教えて頂けないでしょうか。 宜しくお願いします。

  • perlのreadコマンドで変数に読み込まずに捨てる方法は?

    perlのreadコマンドを使って超でかいファイルを途中までの分(下例では1G分)を一気に読み進めて途中から処理を進めたいです。 処理は下記コーディングで問題なく出来ているのですが、4行目のreadに結構時間がかかります。大量サイズを扱うのでしょうがないのかもしれないですが、もしかしたら、変数$bufに読み込まむから時間がかかるという部分があるなら、変数に読まずに1G分のデータをそのまま捨ててて、より高速化をはかることは可能でしょうか?(UNIXの/dev/nullに出力するみたいなイメージで。) +1|open (my $if, "< test.dat"); #超でかいファイルを開く +2|binmode($if); +3|my $buf; +4|read $if,$buf,1000000000; #--- 1G分、一気に進める +5|#--- 以降、読み進めたところから処理を進める。 ・・・

    • ベストアンサー
    • Perl
  • Perl からbashを呼び出したい

    Perlからbashのファイルを呼び出そうとしています。 sendmail2.cgiは、呼び出せていまが、 sendmail3.cgiは、呼び出せません。 bashのファイル自体は、./(bashファイル)とやると実行できます。 パーミッションは、 sendmail3.cgi 655 mail_plain.sh 755 sendmail2.cgi 705 mailsend.sh 705 です。 パスの設定の問題かとも思ったのですが、よくわかりません。 宜しくお願いします。 ===sendmail2.cgi============= #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<P>sendmail test</P>\n"; print "mailtest\n"; print "</HTML>\n"; exec('/home/httpd/wwwroot/yoshida/mailsend.sh'); exit(0); ============================== ===sendmail3.cgi============= #!/usr/bin/perl exec("/home/httpd/wwwroot/bbstest/mail_plain.bash"); exit(0); ==============================

    • ベストアンサー
    • Perl
  • ファイルの入出力が出来ません。

    perlの初心者です。 cgiを作ろうとしています。 標準出力には出力できても、ファイルの入出力が出来ません。 #!/usr/bin/perl open(OUT,">>test"); print OUT "test data"; close (OUT); と実行しても、エラーもでないのですが、ファイルも作られず、書き込みもされません。 しかし、コマンド名'test'としてセーブして、プロンプトから'perl test'とするとファイルに書き込みされるようです。 perlの設定の問題なのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlで文字列の中で重複しているグループ排除等

    サイトで探してもみつからないためこちらで質問します。 タイトルの通り、どのようにしたら重複を排除するか教えてください。 また、半角に限らず全角も排除できるような方法があればそれも教えてください。 たとえば、以下のソースを例に示します。 ------------------ #!/usr/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; my $buf1, $buf2, $buf3, $buf4; $buf1 = 'aabbccdd'; $buf2 = 'ああいいううええ'; $buf3 =~ tr///cs; $buf4 =~ tr///cs; print $buf1 . '->' . $buf3, "\n"; print $buf2 . '->' . $buf4, "\n"; #end ------------------ 上記の方法は、aabbccddをabcd、ああいいううええをあいうえにするといった重複排除のつもりでしたが、結果は以下の通り ------------------ aabbccdd->abcd ああいいうう->ああいいうう ------------------ 半角だとうまくいきますが、全角だとうまくいきません。これは基本的にJCodeなど 絡めて処理する必要があるのでしょうか。 また、「あいうえあいうえ」を「あいうえ」のひとつにする方法もわかりません。 よろしくお願いします。

  • 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 宜しくお願い致します。

専門家に質問してみよう