• 締切済み

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;

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

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> エラーは出ませんが 本当ですか? > ($result) = $telnet->waitfor($prompt2); で使われている $result は宣言されていないようですが。 @resultと$resultは別の変数です。 $resultに取り込んだものを >print(OUT "@result\n"); と@resultで出力することはできません。

tarobe98
質問者

お礼

回答ありがとうございました。 $resurtと使う場合と@resurtを使う場合の両方を考えていたため、 ここに書くテストプログラムにはごっちゃに書いてしまってました。 実際のプログラムは$resurtで統一されているのでエラーは出ませんでした。 いろいろ試した結果、コマンドの応答が複数ページに渡っていたため、 「何かキーを押してください」のメッセージで止まり、プロンプトが 戻らなかったためタイムアウトになっていました。

関連するQ&A

  • 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
  • パスワードを外部ファイルから読み込む

    下記のように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
  • C++のstring型文字列を分割して配列に入れる

    string str = "AABBCCDD"; これを以下のように分割する方法が知りたいです。 result[0] = "AA"; result[1] = "BB"; result[2] = "CC"; result[3] = "DD"; 分割する固定長2と、結果を保存するstring型のresultを与えれば 以下のようになる関数を作りたいのですが、 C++の標準機能でスマートにできる方法がベストです。 Perlでいうunpack見たいなものです。 use strict; my $str = "AABBCCDD"; my @result = unpack '(a2)*', $str; // こんなことをC++でしたい foreach my $val (@result) { print $val, "\n"; } よろしくお願いします。

  • 実行結果が表示されません

    今回PHPからCISCOのルータにテルネット経由にてログインしコマンドを実行、実行結果を出力するプログラムを考えています。 一応ログインし、実行しているようですが・・・実行結果が表示されないです。 何かほかに良い方法があればアドバイス等を頂ければと思います。 <?php // Telnet接続 $tel = new Telnet('ホスト名'); if( @!$tel->connect() ) { return 'TELNET_FAIL'; } elseif( @!$tel->login('ユーザー名' , 'パスワード') ) { return 'TELNET_FAIL'; } $tel->setPrompt($host.'#'); $tel->exec("terminal length 0"); $result[0]=exec("show momory statics"); print $result[0]; ?>

    • 締切済み
    • PHP
  • string型の固定長文字列を配列等に分解する方法

    先ほどジャンル違いで質問してしまったので、再度C/C++の方へ質問いたします。 string str = "AABBCCDD"; これを以下のように分割する方法が知りたいです。 result[0] = "AA"; result[1] = "BB"; result[2] = "CC"; result[3] = "DD"; 分割する固定長2と、結果を保存するstring型のresultを与えれば 以下のようになる関数を作りたいのですが、 C++の標準機能でスマートにできる方法がベストです。 Perlでいうunpack見たいなものです。 use strict; my $str = "AABBCCDD"; my @result = unpack '(a2)*', $str; // こんなことをC++でしたい foreach my $val (@result) { print $val, "\n"; } よろしくお願いします。

  • ログの内容を追加、変更をしたいのですが。。。

    cgiで一度登録した内容を後に変更したい場合、 どのようにすればよいのでしょうか? 番号 名前 アドレス コメント 001,aaaa,aaa@aaa,あいうえお 002,bbb,bb@bb, 003,ccc@ccc, 002のコメントに”かきくけこ”追加する 番号 名前 アドレス コメント 001,aaaa,aaa@aaa,あいうえお 002,bbb,bb@bb,かきくけこ 003,ccc@ccc, という感じなのですが。。。 #!/usr/local/bin/perl require 'pl/cgi-lib.pl'; require 'pl/jcode.pl'; #前のページから追加、変更したいデータを読み込む &ReadParse(*file); my $number = $file{'number'}; my $name = $file{'name'}; my $mail = $file{'mail'}; my $coment = $file{'coment'}; if(open (PEFFILE, ">>log1.txt")){ flock(PEFFILE,2); open (PF, "<log.txt") @date = <PF>; close (PF); foreach $date(@date){ ($number1,$name1,$mail1,$coment1)=split(/\,/,$data); if($number1 eq $number){#番号を一致したら新しい情報を書く print PEFFILE "$number,$name,$mail,$coment\n"; }else{#そうでなければそのまま前と同じ情報を書く print PEFFILE "$number1,$name1,$mail1,$coment1\n"; } flock(FP,8); close (PEFFILE); } と、こんな感じでかなり強引だなと思いつつチャレンジしてみたものの 思ったとおりうまく動いてくれませんでした。 長くなりましたがどうか、よろしくおねがいします。。

    • ベストアンサー
    • CGI
  • 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
  • 正規表現について2

    すみません、前回「正規表現について」でお世話になりました者です。 前回の分は解決したのですが、それに関連してもう少し教えてください。 data.txt---------------------------------------- aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ test.pl----------------------------------------- #!C:\Perl\bin\perl use CGI; my $q = CGI->new; $q->charset('Shift_JIS'); print $q->header(-type => "text/html"); my $line=0; open(IN,"<data.txt"); open(OUT,">output.txt"); while(<IN>){ if ($line++==0){ $output1="$1" if/aaa(.*?)ccc/;} s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } close(OUT); close(IN); print $output1; ------------------------------------------------ とすることで、得られたい結果である、 output.txt-------------------------------------- bbb aaadddccc aaaeeeccc ------------------------------------------------ IEでの表示-------------------------------------- bbb ------------------------------------------------ となりました。そこで今回教えていただきたいのは、 data.txt---------------------------------------- <空行> aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ というようにdata.txtのはじめが空行の場合にも、 上記と同じような結果を得たいです。output.txtの はじめは空行になっても構いません。得られる文字として、上と同じ結果がほしいです。どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl
  • ACCESS2007コンボボックスについて

    ACCESS2007で質問です。 コンボボックスを連動させて、入力を効率よくする方法を教えて頂きたいのです。 データとしては テーブル 1 章  編 A AA A BB A CC B DD B EE C FF テーブル 2 編  分類 AA AAA AA BBB AA  CCC BB DDD CC EEE CC FFF CC GGG DD HHH EE I I I FF JJJ テーブル 3 分類 細目 AAA AAAA BBB BBBB BBB CCCC BBB DDDD CCC EEEE CCC FFFF DDD GGGG EEE HHHH FFF I I I I GGG JJJJ ・・・・・ と、あとテーブルがいくつか続いて テーブル X 条件X   数値情報 AAAAAA 1234 BBBBBB 2345 CCCCCC 9876 DDDDDD 1379 FFFFFF 8462 ・・・・・・・ というツリー状の階層データで構成されます。 最終的にはテーブルXの右側の数字を拾っていく表を作成したいのです。 AAAAAA ~ FFFFFF 等に関する数値データについては最終的には数千になると思いますので、途中でツリーを追いながら入力したいと思っています。 (テーブル2や3でもいきなり20程度の分岐が発生するときもあるので・・・) ネットや書籍で、「コンボボックスの連動」という制御が可能ということでしたので、色々やっております。 フォームにおいて、コンボボックスの1段目はウィザード等で簡単に作成できましたが、2段目が出来ません。 コンボボックスを作成後、プロパティシートの集合値ソースにDLOOKUPや、SELECTを用いた構文を作成すればよいのかと思うのですが、良い方法が分かりません。やりたい事がそのまま載っている本などもあるのですが、2007以前のバージョンだったりして、操作方法からしてよく分からないこともあります。 2段目が出来れば3、4段目も同じ要領だと思いますので、何とかなるかなと思っています。 ACCESSをいじり始めて10日程度の初心者で、用語自体も調べながらの状況ですが、よろしくお願いいたします。

  • DBの更新について困っています

    以前 http://oshiete1.goo.ne.jp/qa5494372.html で質問させていただいたものですが、3の『「貸し出し中ではない」本は、「借りる」といるリンクがつく。「借りる」をクリックすると、JavaScriptによるアラートで「本XXXXを借りますか?」と出す。』まで何とかサブルーチンを使って出来たのですが、それ以降の『データベースを更新して云々』が良く分からないのですが、どのようなコードを書けばDBを更新出来て、図書リストを更新表示出来るのでしょうか?よろしくお願いします。 #!/usr/bin/perl #メイン処理 &start; &analysis; if($pass2 eq ''){ &login; }else{ &msg; } #HTMLヘッダー表示サブルーチン sub start{ } #引数解析サブルーチン sub analysis{  #出来ています } #ログインサブルーチン sub login{ print "<center>"; print "<caption><h2>ユーザーログイン</h2></cption>"; print "<form method=\"post\" action=\"./login2.cgi\">"; print "ユーザー名:"; print "<select name=\"user_name\">"; print "<option value=\"1104\">A</option>"; print "<option value=\"1111\">B</option>"; print "</select><br>"; print "パスワード:"; print "<input type=\"password\" name=\"password\"><br>"; print "<input type=\"submit\" name=\"submit\" value=\"ログイン\">"; print "</form>"; print "</center>"; } #図書管理画面を見せるサブルーチン sub display{ use DBI; use strict; my $dbname = "bookmanagement"; my $host = "localhost"; my $user = ""; my $password = ""; my $table = "booktable"; my $conn = DBI->connect("DBI:Pg:dbname=$dbname;host=$host", $user, $password )|| die "DBI connect failed: $DBI::errstr"; my $sql = "select * from $table order by date desc"; my $result = $conn->prepare($sql); my $ref = $result->execute; print <<HEADER; <body> <center> <table border=2> <caption><h2>図書管理システム</h2></caption> <tr bgcolor="#dcdcdc"> <th>ID</th> <th nowrap>本名称</th> <th nowrap>著者</th> <th>説明</th> <th nowrap>登録日</th> <th nowrap>貸出中?</th> <th nowrap>最終貸出日</th> <th nowrap>最終貸出人</th> </tr> HEADER while(my @ref = $result->fetchrow) { print <<ROW; <script type="text/javascript"> <!-- function dialog(msg){ if(confirm(msg)==true){ } } // --> </script> <tr> <td>$ref[0]</td> <td>$ref[1]</td> <td nowrap>$ref[2]</td> <td>$ref[3]</td> <td nowrap>$ref[4]</td> <td nowrap> <a href="#" onClick="dialog('本「$ref[1]」を借りますか?')">$ref[5]</a> </td> <td nowrap>$ref[6]</td> <td><br>$ref[7]</td> </tr> ROW } print <<FOOTER; </table> </center> FOOTER $result->finish; $conn->disconnect; } #パスワード認証ルーチン sub auth{ use DBI; $db_name = "bookmanagement"; $db_host = "localhost"; $db_user = ""; $db_password = ""; $db_table = "usertable"; $ID = $pass1; $password = $pass2; print <<HEADER; <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title></title> </head> <body> HEADER $conn = DBI->connect("DBI:Pg:dbname=$db_name;host=$db_host",$db_user,$db_password)||die "DBI connect failed: &DBI::errstr"; $sql = "select userID,pass from usertable where pass='$password'"; $result = $conn->prepare($sql); $ref = $result->execute; ($db_userID,$db_password) = $result -> fetchrow_array(); $result -> finish; if(($db_password eq $password) and ($db_userID eq $ID)){ &display; #DBのパスと入力されたパスが同じなら図書管理画面の表示 } else{ print "ログインに失敗しました。ユーザー名・パスワードを確認してください。"; } $conn -> disconnect; } print <<FOOTER; </body> </html> FOOTER 1;

    • ベストアンサー
    • CGI

専門家に質問してみよう