Net::Telnetでタイムアウト時間が短い

このQ&Aのポイント
  • タイムアウト時間を確認するのに、以下のプログラムを実行したのですが、存在しないホストを指定してプログラムを実行しても3秒程度でタイムアウトしてしまいます。
  • 指定したタイムアウト時間(以下のプログラムでは100秒)待つにはどうすればよろしいでしょうか?
  • OS:CentOS 5.1 perl: 5.8.8 Net-Telnet-3.03
回答を見る
  • ベストアンサー

Net::Telnetでタイムアウト時間が短い

タイムアウト時間を確認するのに、以下のプログラムを実行したのですが、存在しないホストを指定してプログラムを実行しても3秒程度でタイムアウトしてしまいます。指定したタイムアウト時間(以下のプログラムでは100秒)待つにはどうすればよろしいでしょうか? お願いします OS:CentOS 5.1 perl: 5.8.8 Net-Telnet-3.03 ===== プログラム ===== #!/usr/bin/perl use Net::Telnet (); my $result; my $h = 'aa.bb.cc.dd'; my $u = 'my_name'; my $pass = 'my_pass'; my $p = '/[\$%#>] $/'; my $t = new Net::Telnet (Timeout => 100, Prompt => $p, Errmode => "return"); $result = $t->open($h); unless($result) { print "open ng\n"; exit; } else { print "open ok\n"; $t->login($u, $pass); print "login ok\n"; $t->print("exit"); }

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

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

接続先のホストが存在しない(icmp destination unreachable)という 応答が返ってきて、終了しているということはありませんか。 存在するが、ファイアウォール等で telnet ポート(port 23)への 接続をドロップしているようなホストを指定するとどうなりますか。

ty_toride
質問者

お礼

アドバイスありがとうございました。 telnet のサービスを殺しているLinuxマシンのIPアドレスに 書き換え様として、typoを見つけてしまいました。 aa.bb.cc.dd と書くべきところ、aa,bb.cc.dd と","が一箇所混じっていたため 即エラーとなっていました。 お騒がせして申し訳ありませんでした。

関連するQ&A

  • telnet接続

    ある装置にtelnet接続し、コマンド(ccc dd ee)を送信して帰ってきた値を outou.dat というファイルに保存するプログラムを作っています。 接続すると login: と表示されるので「aaaa」と入力すると Welcome to aaaa > と表示され、「bbbb」と入力するとプロンプトが「#」に変わります。 >bbbb # そこでコマンド「ccc dd ee」を入力したときに帰ってくる応答をファイルに保存します。 #ccc dd ee ------応答データ-------- これを行うのに下記プログラムを実行しましたが、エラーは出ませんがファイルに何も 保存されませんでした。 何がいけないのかわかる方教えてください。 use strict; use Net::Telnet; my $host = '192.168.1.1'; my $login = 'aaaa'; my $enable = 'bbbb'; my $prompt1 = '/>/'; my $prompt2 = '/\S/'; my $telnet = new Net::Telnet( Timeout => 10, ); $telnet->open($host); $telnet->waitfor('/login:/i'); $telnet->print($login); $telnet->waitfor($prompt1); $telnet->print($enable); $telnet->waitfor($prompt2); my @result; $telnet->print("ccc dd ee"); ($result) = $telnet->waitfor($prompt2); open(OUT, "> outou.dat"); print(OUT "@result\n"); close(OUT); $telnet->close;

  • Telnetモジュールで繋がりません。

    RHL7のperlのプログラムでモジュールを使い、ルータ(BA512R)へtelnet接続し、WAN側のIPアドレスを取得しようと思っています。 プログラムの問題のある行は、 $t->login('user','password'); のようです。 これでも他のTELNETがあるlinuxサーバへは問題なく繋がるのですが、BA512Rへは繋がりません。 通常、telnetを起動し、openを実行すると、user名、password、の順で聞いてきますが、BA512Rは、passwordをいきなり聞かれ、それでログインできます。 この辺が問題なのでしょうか。 しかし、$t->login('','password')としても、BA512Rには繋がりませんでした。 済みませんが、お教えください。 (ちなみに、DDNSサイトを利用してサーバ公開の為のものです。)

    • ベストアンサー
    • Perl
  • Net::SSH::Perlについて

    Net::SSH::Perlを使って、以下のようにリモートマシン上のコマンドを実行しています。 my $ssh = Net::SSH::Perl->new("host"); $ssh->login("user", "pass"); ($out, $err, $exit) = $ssh->cmd("command"); "command"に失敗した場合は、$errにエラー内容が格納されますが、hostやuser、passが間違っていた場合は、Permission deniedとなって、プログラムが終了してしまいます。 hostやuser、passの間違いで$ssh->cmdを失敗した場合にエラーを取得する方法があれば教えてください。

    • ベストアンサー
    • Perl
  • パスワードを外部ファイルから読み込む

    下記のようにcisco機器にloginして、show clockコマンドを事項するperlを複数の機器を対象に実行したいと現在考えております。 ログインパスワードにつきましては定期的に変更するよう運用しているため、外部のファイルを参照するように出来ればと思いますが、perl初心者のため方法が全く分かりません。ご教授頂ければ幸いです。 ****************** use Net::Telnet::Cisco; my $session = Net::Telnet::Cisco->new(Host => 'IPアドレス'); $session->login('login', 'ログインパスワード'); ←※ここを外部ファイルを参照するようにできればと考えています。 # Execute a command my @output = $session->cmd('show clock'); open(OUT,">showclock.txt"); print OUT @output; close(OUT); $session->close; ****************** よろしくお願い致します。

    • ベストアンサー
    • Perl
  • Perlの多重起動を禁止したい

    main_01.plというプログラムがあります。 これは10分毎にバッチファイルから起動の命令が下ります。ただしプログラムの処理によっては10分以上かかることがあります。 この時、main_01.pl がすでに起動していた場合、main_01.pl はすぐに exit; になるように組みたいのです。僕が考えた方法は、あるテキストファイルにロックをかけ、そのファイルがロック中であるならばプログラムは処理を行わずすぐに終了する、といった感じです。 =============================== # タイムアウト処理 my $timeout = 5; # 排他処理 my $lockfile="lock.txt"; # 多重起動停止 (ここに $lockfile が書き込めなかったらmain_01.plは別に起動していることになるので起動しない。) # 排他処理開始 open(LOCK,"$lockfile"); flock(LOCK,2); # 処理開始 eval { # タイムアウト local $SIG{ALRM} = sub { die "alarm\n" }; alarm( $timeout ); # プログラムスタート print "\n◆スタート\n\n"; sleep(4); # プログラム終了 print "\n◆終わりました。\n\n"; }; # タイムアウト処理 if ( $@ ) { # タイムアウト print "\nタイムアウトしました。TIMEOUT= $timeout \n"; } else { # タイムアウトせずに正常終了 print "\n正常終了しました。\n"; } # 排他処理終了 close(LOCK); exit;

    • ベストアンサー
    • Perl
  • 文字列のマッチについて

    お世話になっております。 いま、ルータにtelnetして 特定のコマンドを実行後、結果からカウンタ値を出力する perlを作成しているのですが、 カウンタ値を正規表現を用いて引っ掛けることが出来ません。 作成したperl ---------------------------------------------------------- #!/usr/bin/perl use Net::Telnet; $user = "admin"; $pass = "admin"; $telnet = new Net::Telnet(); $telnet = Net::Telnet->new(Host => '192.168.0.254'); $telnet->login($user, $pass) ; print $telnet->cmd("svintr-config"); print $telnet->cmd('terminal length 0'); @lines = $telnet->cmd('show ip napt translation'); foreach (@lines) { if (/^NAPT Cache - /) { /\[(\d+) entry]/; $napt= $1; } } print "\n" ; print "napt is"; print "\n" ; print $napt, "\n"; ---------------------------------------------------------- show ip napt translationの実行結果  router(config)# show ip napt translation  Interface: FastEthernet0/0.1  NAPT Cache - 31 entry, 4065 free, 1299 peak, 10073179 create, 0 overflow  Codes: A - ALG, S - Static, Service  router(config)# telnetして特定のコマンドをは実行できてるのですが、 NAPT Cache - 31 entry, の 31 を取得できません。 ご教授頂けないでしょうか。 宜しくお願い致します。

  • perlでtelnetクライアント

    perlで、ソケットを使って、telnet(ポート23)クライアントを作ろうと思いました。 telnet接続すると、まず最初にサーバー側から"login: "とプロンプトが出力されるので、それを読もうとしたところ、プロンプトなので改行が来ないためか、待ち状態になりました。 while(<socket>) print $_; while(read(socket, $c, 1) print $c; の2パターン試しましたが、どちらも1文字も読めませんでした。 改行が来なくても、読込みができるテクニックはありますでしょうか。 perlのスキルは、他人のを参考にしないと作れない程度の素人同然です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlでCSV形式ファイルのアップロード

    本日、同じ質問をしたものです。 前回の問題は解決したのですが、ファイルがアップロードできないで悩んでします。 CGIのプログラムは以下のソースです。 #! c:/perl/bin/perl use CGI; # CGIヘッダーの出力 print "Content-type: text/html\n\n"; my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./a.csv"); binmode(OUT); while(read($fileName,$buffer,1024)) { print OUT $buffer; } close(OUT); close($fileName); #ファイルハンドルをcloseしています。 exit ; ファイルは、作られるのですが、中身が書き込まれません。 どなたか教えてください。 お願いします。

    • ベストアンサー
    • Perl
  • Rubyを使ってtelnetで実行したコマンドの標準出力を取得したいのですが…

    Rubyを使って、以下のような手順のプログラムを作成しています。 1.Telnetでサーバ(Fedora7)にログイン 2.ifconfigを実行 3.標準出力される結果をファイルに記録 次のように試してみたのですが、結果をファイルに記録することが、できないでいます。 require 'net/telnet' log = File.open("ifconfig.log",'a+') # リモートホスト foobar に接続 telnet = Net::Telnet.new("Host" => "192.168.1.1") {|c| print c} telnet.login("username", "password") {|c| print c} telnet.cmd("ifconfig"){|c| log.print(c)} log.close 標準出力される結果をファイルに記録する方法を知っているかたがおられましたら、教えていただけませんでしょうか。 宜しくお願いいたします。

  • FTP接続時失敗時、接続先名をcsvに出力する

    Perl 初心者です。 FTP接続時失敗時、接続先名をcsvに出力する(書き出す)プログラムを作成しております。 ※複数FTPサーバがあり順番に接続していき、接続失敗したところをcsvに一覧にして出力したいです。もし、csvファイルがない場合、C:/logの下にERROR.csvを作成する必要もあります。 今現在、私が作成しているプログラムが以下になります。 #!C:/Perl/bin/perl use Net::FTP; use strict; my $i; my $j; my @ftp_data = ( ['ftp','192.168.0.0'], ['ftp2','192.168.0.10'], ); sub error{ my $file = "ERROR.csv"; if(!-d"C:/log/$file"){ open(TFILE,"+>> $file") or die($!); print OUT "$ftp_data[$i][0]"; close(TFILE); } else{ open(OUT, ">> $file"); # 追加オープン print OUT "$ftp_data[$i][0]"; close(TFILE); } exit; } for ($i = 0; $i <= $#ftp_data; $i++){ #FTPサーバーへの接続 my $ftp = Net::FTP->new("$ftp_data[$i][1]") or &error; #ユーザー名とパスワードを指定してログイン $ftp->login('user','password') or die $ftp->message; print "connect $ftp_data[$i][1]\n"; #接続終了 $ftp->quit; } 実行してみると何もでないでずっとループ?しているみたいなのですが、 どこが悪いのかよく分からないのです。 ご教示いただけないでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう