こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

パスワードを外部ファイルから読み込む

下記のように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;
******************

よろしくお願い致します。

投稿日時 - 2009-06-08 11:25:38

QNo.5026524

困ってます

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

Telnetログインできる機器であれば

Net::Telnetモジュールを使用すれば、ユーザ名が聞かれても
ログインしコマンドを実行することが可能です。
(SSHであればNet::SSHってのもあります。)

(例)
#!/usr/bin/perl

use strict;
use warnings;
use Net::Telnet;

my $host = "hostname";
my $pass = "password";

#ホストに接続しログイン
my $telnet = new Net::Telnet(Timeout => 10);
$telnet->open($host);
$telnet->login($user,$pass);

#コマンド実行(dateコマンドを実行)
my @result = $telnet->cmd("date");
print "@result\n";

#ログアウトし切断
$telnet->cmd("exit");
$telnet->close;

exit;

※使い方の詳細はperldocやcpanで確認してください。

投稿日時 - 2009-06-10 23:51:20

お礼

ご回答有難う御座います。
Net::Telnetを使うのも一つなんですね。
参考にさせて頂きます。

有難う御座いました。

投稿日時 - 2009-06-12 00:29:01

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

パスワードを外部ファイルから読み込むだけなら

open(PASS,"<./password.txt");
@hoge = <PASS>;
$pass = $hoge[0];

こんな感じで読み込むことも可能ですが、自分だったら
ホスト名、IPアドレス、パスワードも外部ファイルから
読み込むように書きます。

#**********************************************************
■外部ファイル
○下記の形式で記述

ホスト名:
 - IPアドレス
 - パスワード
※'-'の前後に半角スペースが必要!

#(例) list.yaml
hostname1:
 - 192.168.111.111
 - password1

hostname2:
 - 192.168.111.112
 - password2

hostname3:
 - 192.168.111.113
 - password3

※半角スペースが抜けていたり、不要なスペースが入っていると
 読み込み時にエラーが発生するので注意!

#**********************************************************
■Cisco機器へTelnet
○ホスト名毎にログを書き出す

#!/usr/bin/perl

use strict;
use warnings;
use Net::Telnet::Cisco;
use YAML;
use Data::Dumper;

############################################
# hostname,ipaddress,password read file
############################################
my $host = YAML::LoadFile('./list.yaml');
#print Dumper($host);

############################################
# telnet in each host
############################################
foreach my $hostname(keys(%{$host})){
my $ip = $host->{$hostname}[0];
my $pass = $host->{$hostname}[1];

print "$hostname ...";
&telnet_cisco($hostname,$ip,$pass);
print "done\n";
}

#############################################
# Net::Telnet::Cisco sub
#############################################
sub telnet_cisco {

my ($hostname,$ip,$pass) = @_;
my $session = Net::Telnet::Cisco->new(
Host => $ip,
Timeout => 10,
);

$session->login('login',$pass);
my @result = $session->cmd("show clock");
$session->close;

chomp(@result);
open(LOG,">>./$hostname.txt");
foreach my $value(@result){
print LOG "$value\n";
}
close(LOG);
}

exit;

※エラー処理は書いてないので適度に入れてください。
参考になったかな。。。

投稿日時 - 2009-06-08 20:58:01

お礼

ご回答有難うございます。

open(PASS,"<./password.txt");
@hoge = <PASS>;
$pass = $hoge[0];
で実行したところ、うまくperlが走りました。有難うございます。

機器によっては、user名をパスワード入力前に聞いてくるものがあります。それにはどのように対応すればよろしいでしょうか。
それほど数がないので、ご返信頂いたように外部ファイルを見に行かないで、perl内にuser名を明記しようと考えています。

再度ご教授頂けたら幸いです。

投稿日時 - 2009-06-09 11:48:53

あなたにオススメの質問